SceneManager.LoadScene(“”);//传入场景名,就可以实现同步切换了。
场景同步加载的缺点:
在切换场景时,Unity会删除当前场景上所有对象,并且去加载下一个场景的相关信息。
如果当前场景对象过多或者下一个场景对象过多,这个过程会非常的耗时,会让玩家感受到卡顿。所以异步切换就是来解决该问题的。
1.异步加载 第一种方式:通过事件回调函数异步加载
异步加载场景的API:SceneManager.LoadSceneAsync(“场景名称”);
如果想要加载结束之后做一些逻辑处理的话该怎么做?
我们可以看到,异步加载场景函数的返回值类型AsyncOperation中有一个event类型的成员。Event是事件类型,相当于一个更加安全的委托(这里可以把它当做委托来理解)。当Unity异步加载完场景之后,会自动调用completed中的函数。
例如,下面这个OverLoad()方法是我们想要场景加载结束之后去调用的方法
private void LoadOver(AsyncOperation ao){
print("LoadOver");
}
那么这样就可以让Unity在场景加载结束之后去自动调用方法了,
AsyncOperation ao=SceneManager.LoadSceneAsync("场景1");
ao.complette+=LoadOver;
通过事件回调函数来实现异步加载的话,当场景加载结束之后,如果你希望去做一些逻辑处理的话,就在事件中添加监听函数就可以了。
2.异步加载 第二种方式:通过协程异步加载
IEnumeratior LoadScene(string name){
//异步加载场景
AsyncOperation ao=SceneManager.LoadSceneAsync(name);
//unity内部的协程协调器法线是异步加载类型的返回对象就会等待
//等待异步加载结束后才会继续执行迭代器函数中后面的步骤
yield return ao;
}
Yield return 一个AsyncOperation类型,Unity中的协程协调器就会等待加载完毕之后,再去处理之后的逻辑。
需要加载场景的时候,开启协程来启动场景加载
StartCoroutine(LoadScene("场景1"));
注意:加载场景之后,原有场景中的所有东西都会被删除,包括脚本。这就意味着,当切换场景的时候,当前脚本就失效了,因此加载场景完毕之后的逻辑都不会被执行了。如果想要脚本没有问题,就要让脚本依附的对象过场景不移除。
DontDestroyOnLoad(this.gameObject);
两种方式对比:
第一种方式更加简单,但是它一定要在场景加载结束之后才能去执行指定的逻辑。
第二种方式虽然复杂,但是可以让我们在异步加载中做一些事情。
比如,我们可以在异步加载过程中去显示加载的进度条。
第一种方式:利用异步加载的进度去更新
在异步加载类型AsyncOperation中,成员progress就是来获取加载进度的,isDone表示是否加载完毕。
第二种:根据你的游戏规则,自己定义进度条变化的条件
比如,场景加载结束,更新20%的进度,接着去加载场景中的其他信息,比如动态加载怪物,加载结束后让进度条再增加20%,接着再通道加载物品,更新进度条……
场景异步加载有两种方式
1.通过事件回调函数
2.协程异步加载
1.事件回调函数
优点:写法简单,逻辑清晰
缺点:只能加载完场景做一些事情 不能再加载过程中处理逻辑
2.协程异步加载
优点:可以在加载过程中处理逻辑,比如进度条更新等
缺点:写法较为麻烦,要通过协程