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%
    //动态加载 场景模型
    //这时候 认为加载结束了, 进度条拉满
    //隐藏进度条
}
相关推荐
还是大剑师兰特5 小时前
Unity3D(Unity)完整详细介绍
unity·游戏引擎
ellis19708 小时前
u3d插件xLua[七]例6 Coroutine
unity
还是大剑师兰特9 小时前
Unity 从零搭建简易3D场景(新手分步教程)
3d·unity·游戏引擎
神码编程10 小时前
【Unity】TankBattle联机坦克大战(三)创建关卡(生成地块)
unity·游戏引擎·帧同步·坦克大战
淡海水10 小时前
C#与常用数据结构源码剖析-全篇导览
开发语言·数据结构·unity·面试·职场和发展·c#
玖玥拾1 天前
Unity3D RPG 入门项目(四)背包拖拽、物品悬浮提示、项目开发思维
3d·unity·游戏引擎
xcLeigh1 天前
Unity基础:Start与Update方法——Unity脚本生命周期初探
java·unity·游戏引擎·教程
郝学胜-神的一滴1 天前
[简化版 GAMES 104] 现代游戏引擎 05:游戏引擎世界构建核心机制深度解析
c++·程序人生·unity·游戏引擎·计算机图形学·opengl
松树戈2 天前
godot项目【宝石捕手】04~添加音效、记分
游戏引擎·godot
LONGZETECH2 天前
无人机实训高成本痛点解法:虚拟仿真实现 70% 耗材损耗下降
大数据·算法·unity·架构·无人机