Unity脚本无法正常切换场景求助:点击按钮仅加载首个场景
问题原因
默认情况下,SceneManager.LoadScene()使用LoadSceneMode.Single模式,加载新场景时会销毁当前场景的所有对象。你的协程所在的脚本属于当前场景的对象,场景2加载完成后这个脚本就被销毁了,所以yield return new WaitForSeconds(5)之后的代码根本不会执行。
解决方案
给你三种适合新手的解决思路:
方法1:使用 additive 加载模式(保留原场景)
修改加载逻辑,加载场景2时不销毁当前场景,等协程执行完再处理场景3:
using UnityEngine.SceneManagement; public void PickLockClick() { StartCoroutine(PickLockScene()); } IEnumerator PickLockScene() { // 加载场景2,不销毁当前场景 SceneManager.LoadScene(2, LoadSceneMode.Additive); yield return new WaitForSeconds(5); // 卸载场景2后加载场景3,也可以直接用Single模式加载场景3覆盖所有 SceneManager.UnloadSceneAsync(2); SceneManager.LoadScene(3); }
注意:这种方式要避免场景2的相机、UI和原场景冲突,必要时可以暂时禁用原场景的相关对象。
方法2:把协程放到永不销毁的对象上
创建一个空对象,给它添加脚本并设置DontDestroyOnLoad,这样场景切换时对象不会被销毁,协程能完整执行:
using UnityEngine; using UnityEngine.SceneManagement; public class SceneLoader : MonoBehaviour { void Awake() { // 确保对象在场景切换时不被销毁 DontDestroyOnLoad(gameObject); } public void PickLockClick() { StartCoroutine(PickLockScene()); } IEnumerator PickLockScene() { SceneManager.LoadScene(2); yield return new WaitForSeconds(5); SceneManager.LoadScene(3); } }
操作步骤:
- 在当前场景创建空对象,挂载这个脚本
- 按钮的点击事件绑定到该脚本的
PickLockClick方法
方法3:在场景2中添加计时脚本(最直观)
直接在场景2里放一个脚本,进入场景后自动计时5秒再加载场景3:
using UnityEngine; using UnityEngine.SceneManagement; public class LoadScene3AfterDelay : MonoBehaviour { void Start() { StartCoroutine(LoadScene3()); } IEnumerator LoadScene3() { yield return new WaitForSeconds(5); SceneManager.LoadScene(3); } }
操作步骤:
- 打开场景2,创建空对象并挂载这个脚本
- 确保场景3已经添加到Build Settings的
Scenes In Build列表中
额外注意事项
- 所有要加载的场景(场景2、场景3)必须添加到File > Build Settings > Scenes In Build列表里,否则会加载失败
- 检查场景编号是否正确,Build Settings里的顺序就是场景的编号(第一个是0,第二个是1,以此类推),别搞混了
内容的提问来源于stack exchange,提问作者tvsA
相关产品推荐
相关产品推荐

