You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:58:55