Unity基础(十四)场景异步加载

1、为什么用异步

SceneManager.LoadScene("Scene2");

场景的同步切换

同步切换场景时unity会删除当前场景上所有对象

并且去加载下一个场景的相关信息

如果当前场景 对象过多或者下一个场景对象过多

这个过程会非常的耗时 会让玩家感受到卡顿

异步切换解决这个问题

2 场景异步加载

当场景异步加载结束后,就会自动调用该事件函数 我们如果希望在结束后 做一些事情 ,那么可以在该函数中写逻辑

cs 复制代码
AsyncOperation ao=SceneManager.LoadSceneAsync("Scene2");
ao.completed += (a) =>
{
    print("123");
};
ao.completed += LoadOver;

 private void LoadOver(AsyncOperation ao)
 {
     print("LoadOver");
 }

2 协程异步加载

加载场景会把当前场景上 没有特别处理的对象 都删除了

所以协程中的部分逻辑是可能执行不了的

解决思路

让处理场景加载的脚本依附的对象 过场景时 不被移除

cs 复制代码
 StartCoroutine(LoadScene("Scene2"));
 DontDestroyOnLoad(this.gameObject);

IEnumerator LoadScene(string name)
{
    //第一步 异步加载场景
    AsyncOperation ao =SceneManager.LoadSceneAsync(name);
    
    print("over");
    //协程好处 加载的同时 可以处理别的逻辑
    yield return ao;
    //unity内部的  协程协调器 发现异步加载类型的返回对象 那么就会等待
    //等待异步加载结束后 才会继续执行 迭代器函数中后面的步骤
    //第二步
    print("还有");
    //我们可以在异步加载过程中 去更新进度条
    //第一种 是利用场景异步加载 的进度 去更新 但是不是特别准确,一般也不会用
    //进度控制不了,
    while (!ao.isDone)
    {
        print(ao.progress);
        yield return null;
    }
    //第二种 是根据游戏的规则 自己定义进度变化的条件
    //场景加载结束 更新20%进度条
    //接着去加载场景中的其他信息
    //比如 动态加载怪物
    //这时 进度条再更新20%
    //动态加载 场景模型
    //这时候 认为加载结束了, 进度条拉满
    //隐藏进度条
}
相关推荐
萌萌的提莫队长4 小时前
Unity相机捕捉,图像识别,抠像+合成
opencv·unity
mxwin1 天前
Unity Shader 光线追踪原理与实战案例
unity·游戏引擎
地狱为王1 天前
Unity使用DPDFNet实现实时语音增强(降噪)
unity·语音增强·降噪·dpdfnet
平行云PVT1 天前
国产信创实时云渲染解决方案:如何实现数字孪生与三维应用云化部署?
unity·webrtc·unreal engine·实时云渲染·国产信创·摩尔线程·砺算科技
夏炎黄1 天前
Terrain地形剪裁
unity
小贺儿开发1 天前
DeepSeek + Codex + MCP:Unity 游戏开发实测
科技·游戏·unity·ai·程序员·编程·deepseek
新的瑞拉公主1 天前
Cocos plist 粒子一键导入 Unity:Editor 工具实现与参数映射
unity·游戏开发·cocos2d-x·粒子系统·editor工具
淡海水1 天前
03-02-架构篇-Boehm GC架构解析
unity·架构·c#·gc·boehm
xcLeigh2 天前
Unity基础:Instantiate实例化——在运行时动态创建游戏物体
游戏·unity·游戏引擎·教程·instantiate
流浪打工人3 天前
Unity3d TimeLine中audio track的使用
unity