当前位置:   article > 正文

Unity 异步加载场景_unity异步加载场景

unity异步加载场景

回顾场景同步加载

SceneManager.LoadScene(“”);//传入场景名,就可以实现同步切换了。
  • 1

场景同步加载的缺点:
在切换场景时,Unity会删除当前场景上所有对象,并且去加载下一个场景的相关信息。
如果当前场景对象过多或者下一个场景对象过多,这个过程会非常的耗时,会让玩家感受到卡顿。所以异步切换就是来解决该问题的。

场景异步加载

异步加载的两种方式

1.异步加载 第一种方式:通过事件回调函数异步加载
异步加载场景的API:SceneManager.LoadSceneAsync(“场景名称”);
如果想要加载结束之后做一些逻辑处理的话该怎么做?
我们可以看到,异步加载场景函数的返回值类型AsyncOperation中有一个event类型的成员。Event是事件类型,相当于一个更加安全的委托(这里可以把它当做委托来理解)。当Unity异步加载完场景之后,会自动调用completed中的函数。
在这里插入图片描述

例如,下面这个OverLoad()方法是我们想要场景加载结束之后去调用的方法

private void LoadOver(AsyncOperation ao){
   print("LoadOver");
}
  • 1
  • 2
  • 3

那么这样就可以让Unity在场景加载结束之后去自动调用方法了,

AsyncOperation ao=SceneManager.LoadSceneAsync("场景1");
ao.complette+=LoadOver;
  • 1
  • 2

通过事件回调函数来实现异步加载的话,当场景加载结束之后,如果你希望去做一些逻辑处理的话,就在事件中添加监听函数就可以了。

2.异步加载 第二种方式:通过协程异步加载

IEnumeratior LoadScene(string name){
  //异步加载场景
  AsyncOperation ao=SceneManager.LoadSceneAsync(name);
  //unity内部的协程协调器法线是异步加载类型的返回对象就会等待
  //等待异步加载结束后才会继续执行迭代器函数中后面的步骤
  yield return ao;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

Yield return 一个AsyncOperation类型,Unity中的协程协调器就会等待加载完毕之后,再去处理之后的逻辑。
需要加载场景的时候,开启协程来启动场景加载

StartCoroutine(LoadScene("场景1"));
  • 1

注意:加载场景之后,原有场景中的所有东西都会被删除,包括脚本。这就意味着,当切换场景的时候,当前脚本就失效了,因此加载场景完毕之后的逻辑都不会被执行了。如果想要脚本没有问题,就要让脚本依附的对象过场景不移除。

DontDestroyOnLoad(this.gameObject);
  • 1

两种方式对比:
第一种方式更加简单,但是它一定要在场景加载结束之后才能去执行指定的逻辑。
第二种方式虽然复杂,但是可以让我们在异步加载中做一些事情。

比如,我们可以在异步加载过程中去显示加载的进度条。

如何实现进度条更新

第一种方式:利用异步加载的进度去更新
在异步加载类型AsyncOperation中,成员progress就是来获取加载进度的,isDone表示是否加载完毕。
在这里插入图片描述

具体实现
在这里插入图片描述

第二种:根据你的游戏规则,自己定义进度条变化的条件
比如,场景加载结束,更新20%的进度,接着去加载场景中的其他信息,比如动态加载怪物,加载结束后让进度条再增加20%,接着再通道加载物品,更新进度条……

总结

场景异步加载有两种方式
    1.通过事件回调函数
    2.协程异步加载
  • 1
  • 2
  • 3

1.事件回调函数
优点:写法简单,逻辑清晰
缺点:只能加载完场景做一些事情 不能再加载过程中处理逻辑
2.协程异步加载
优点:可以在加载过程中处理逻辑,比如进度条更新等
缺点:写法较为麻烦,要通过协程

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/114201?site
推荐阅读
相关标签
  

闽ICP备14008679号