Unity中如何等待场景卸载完成后执行后续逻辑?
解决场景异步卸载未完成就执行后续代码的问题
嘿,这个问题我之前也碰到过!核心原因就是SceneManager.UnloadSceneAsync()是异步操作——它会立即返回,不会阻塞主线程,所以你后面的Cursor.visible = false和GameControl.player.SetActive(true)会在主菜单场景还没完全卸载的时候就执行,这时候两个场景的相机同时存在,自然会短暂看到主菜单的GUI元素。
要解决这个问题,我们只需要等待异步卸载操作完成后,再执行后续代码就行。具体做法是利用UnloadSceneAsync()返回的AsyncOperation对象,通过协程来等待它完成。
修改后的代码如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; public class LoadSceneOnClick : MonoBehaviour { private Scene scene; private void Start() { scene = SceneManager.GetActiveScene(); StartCoroutine(WaitForSceneUnLoad(SceneManager.GetSceneByName("The Space Station"))); } public IEnumerator WaitForSceneUnLoad(Scene scene) { return null; } public void ActivatePlayer() { // 启动协程,等待场景卸载完成后再执行后续逻辑 StartCoroutine(ActivatePlayerAfterUnload()); } private IEnumerator ActivatePlayerAfterUnload() { // 发起异步卸载请求,获取操作实例 AsyncOperation unloadOp = SceneManager.UnloadSceneAsync(0); // 等待卸载操作完全完成 yield return unloadOp; // 现在主菜单场景已经彻底卸载,执行后续代码 Cursor.visible = false; GameControl.player.SetActive(true); } }
关键改动说明:
- 新增了私有协程方法
ActivatePlayerAfterUnload(),专门处理等待卸载+后续逻辑的流程 - 通过
AsyncOperation unloadOp = SceneManager.UnloadSceneAsync(0)获取卸载操作的引用 - 使用
yield return unloadOp让协程暂停,直到卸载操作完全完成 - 只有当卸载完成后,才会执行隐藏光标和激活玩家的代码,这样就不会出现两个场景相机同时显示的问题了
如果想要更严谨一点,还可以在等待期间添加加载提示,或者主动检查unloadOp.isDone状态,但直接yield return unloadOp已经足够保证等待到卸载完成啦。
内容的提问来源于stack exchange,提问作者Daniel Lip
相关产品推荐
相关产品推荐

