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%
//动态加载 场景模型
//这时候 认为加载结束了, 进度条拉满
//隐藏进度条
}