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%
    //动态加载 场景模型
    //这时候 认为加载结束了, 进度条拉满
    //隐藏进度条
}
相关推荐
微三云生态系统架构师-彭丹11 小时前
任务卷轴积分系统架构设计:从任务状态机到合规风控的完整实现
unity·系统架构·游戏引擎
XR技术研习社12 小时前
从 PICO 文档看未来短期内的 Unity 版本选择
unity·游戏引擎·xr·vr
玖玥拾15 小时前
Unity 热更新(一)
unity·游戏引擎
软件黑马王子15 小时前
1.non-MonoBehaviour 单例模式泛型基类
unity·前端框架·c#
KhalilRuan1 天前
Unity性能优化
unity·性能优化·游戏引擎
ellis19701 天前
u3d IMGUI[二] 编辑器扩展
unity
五仁烧饼2 天前
Unity性能优化系列内存篇 - 移动端内存优化
unity·性能优化·游戏引擎
WiChP3 天前
【V0.1B15】从零开始的2D游戏引擎开发之路
游戏引擎
zhchyun20085 天前
# 【Unity UI 进阶】仿 Element UI 打造企业级 Unity UI 组件库(06)
ui·unity·游戏引擎
Behaviour5 天前
Unity游戏HybridCLR 热更新接入实战
游戏·unity·游戏引擎