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%
    //动态加载 场景模型
    //这时候 认为加载结束了, 进度条拉满
    //隐藏进度条
}
相关推荐
xcLeigh20 小时前
Unity基础:创建你的第一个游戏物体——Cube、Sphere与基本3D物体
游戏·3d·unity·教程
ellis197020 小时前
C#异常相关关键字:Exceptions,throw,try,catch,finally
unity·c#
HH‘HH1 天前
Unity通过OPC UA工业协议连接工业设备实战指南
unity·游戏引擎
め.2 天前
定点数运算库
算法·unity
点量云实时渲染-小芹2 天前
UE/Unity/Webgl模型在信创服务器上实时渲染推流的可行性分析
unity·webgl·云渲染信创·国产实时渲染·ue信创云推流
Duo1J2 天前
【UE】Slate 编辑器工具开发03 - 节点编辑器 (EdGraph)
ue5·编辑器·游戏引擎·ue4
郝学胜-神的一滴2 天前
[简化版 GAMES 104] 现代游戏引擎 02:拆解现代游戏引擎5+1层级架构,吃透引擎底层核心逻辑
c++·unity·架构·游戏引擎·图形渲染·unreal engine·系统设计
unityのkiven2 天前
Unity 中如何创建一片森林:享元模式能不能用?应该怎么用?
unity·游戏引擎·享元模式
LONGZETECH2 天前
新能源汽车充电设备装配与调试仿真教学软件 技术架构与核心实现解析
大数据·算法·3d·unity·架构·汽车