Unity 场景切换

1. 场景同步切换

  • 方法:SceneManager.LoadScene("SceneName")
  • 加载下一个场景的过程可能耗时,如果场景对象过多,会造成卡顿。

2. 场景异步切换

Unity 异步切换场景和 资源异步加载 原理类似,主要有两种方式:

2.1 事件回调方式

public class Test : MonoBehaviour
{
  void Start()
  {
    AsyncOperation ao = SceneManager.LoadSceneAsync("SceneName");
    ao.completed += (a) =>
    {
        // 可以在场景加载完成后做一些操作
        print("场景加载完成");
    };
  }
}
  • 优点:写法简单,逻辑清晰
  • 缺点:只能在场景加载完成后处理逻辑,无法在加载过程中更新进度条或做额外操作

2.2 协程方式

  • 需要注意的是 加载场景会把当前场景上 没有特别处理的对象 都删除了,所以 协程中的部分逻辑 可能是执行不了的
  • 解决思路:让处理场景加载的脚本依附的对象 过场景时 不被移除
// 不被切场景删除
public class Test : MonoBehaviour
{
  void Start()
  {
    DontDestroyOnLoad(this.gameObject);
    StartCoroutine(LoadScene("SceneName"));
  }
  IEnumerator LoadScene(string sceneName)
  {
    AsyncOperation ao = SceneManager.LoadSceneAsync(sceneName);

    // 加载过程中可以执行其他逻辑,例如更新进度条
    while (!ao.isDone)
    {
        print(ao.progress); // 0~1,加载进度
        yield return null;   // 等待下一帧
    }
    print("场景加载完成");
    Destroy(this.gameObject); // 加载完成后可销毁
  }
}
  • 优点:可以在加载过程中处理逻辑(更新进度条、加载其它数据等)
  • 缺点:写法稍复杂,需要使用协程

协程方式适合需要显示加载进度或在加载过程中执行额外逻辑的情况。


3. 注意事项

  1. 异步加载场景时,未做处理的物体会随场景切换被删除,如果需要保留某些对象,可使用 DontDestroyOnLoad(gameObject)
  2. 协程中可利用 AsyncOperation.progress 获取加载进度,但进度可能不是百分百精确。
  3. 协程完成后,建议销毁临时管理脚本或物体,以免占用内存。

posted @ 2025-12-10 23:09  高山仰止666  阅读(35)  评论(0)    收藏  举报