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%
    //动态加载 场景模型
    //这时候 认为加载结束了, 进度条拉满
    //隐藏进度条
}
相关推荐
魔士于安2 天前
unity 丑陋哥布林 哥布林有humannoid 动画没 带动画
unity·游戏引擎·材质·贴图·模型
小贺儿开发3 天前
Unity 家居视频遥控(细节优化)
科技·unity·程序员·udp·视频·工具·通信
淡海水3 天前
13-04-面试-源码级深度追问链
数据结构·unity·面试·c#·游戏引擎·源码·il2cpp
小小数媒成员3 天前
UGUI 性能优化(详细,全,深入)
开发语言·unity·游戏引擎
林川~014 天前
Unity新输入系统使用笔记
unity·input system
小贺儿开发4 天前
Unity 结合百度AI开放平台 手写文字识别
人工智能·科技·学习·unity·云服务·文字识别·手写文字
goujunwe4 天前
GEO 评估方法:如何自测你的内容,会不会被 AI 引用
搜索引擎·网络安全·游戏引擎·全文检索·中文分词
林川~015 天前
Unity 万能物理检测工具:射线检测 / 范围检测 / 层级过滤 / 编辑器可视化(可直接拿去用)
游戏·unity·c#·射线检测·通用工具
yi碗汤园5 天前
MQTT消息队列遥测传输协议
网络·网络协议·unity
林川~015 天前
Unity 常用 API 与核心类全解:从生命周期到协程,附性能避坑清单(Unity 6 适配)
unity·游戏引擎·常用api