当前位置:   article > 正文

unity异步加载跳转场景_allowsceneactivation

allowsceneactivation

本文结合unityAPI书写综合,并且但不限于网络相关内容资料整合而成。

AsyncOperation是unity当中的异步操作协同程序

其中的变量:

allowSceneActivation:是否(true/false)允许在场景准备就绪后立即跳转场景

isDone:该操作是否已经完成(返回一个true/false)

priority:调整您的异步加载顺序

progress:获取当前操作进度

unity官网API参见:

Unity 脚本 API---AsyncOperationhttps://docs.unity3d.com/cn/2020.2/ScriptReference/AsyncOperation.html那么接下类我们来说说用法

首先你需要知道的

1.上面四个变量的大致作用

2.progress:这里面有这样一个说法“当进度浮点值到达 1.0 并调用 isDone 时,操作结束。如果将 allowSceneActivation 设置为 false,则进度将在 0.9 处停止,直到被设置为 true”

然后我们开始操作,代码如下:

  1. using UnityEngine.SceneManagement;//添加引用的
  2. using UnityEngine.UI;//添加引用的
  3. public Button but;//声明了一个按钮
  4. public GameObject obj;//声明了一个对象
  5. public Slider slider;//声明了一个进度条
  6. public Text text;//显示文字

ok,那么到这里先来说说我要做什么

点击面板中的一个“按钮”,然后会出来一个“进度条”进行加载,在加载的时候会显示一个“text的百分比”,接着就加载到另一个场景中了。

然后我在“Start”函数当中做了个按钮点击

  1. but.onClick.AddListener(() =>
  2. {
  3. obj.SetActive(false);//隐藏按钮面板
  4. this.gameObject.SetActive(true);//显示进度条面板
  5. Loadybjz();//调用异步加载函数
  6. });

接着我在里面只写了

  1. public void Loadbjz()
  2. {
  3. StartCoroutine(Loadlev());//开始协同程序
  4. }

这里请注意不要写在Update之类的函数当中,否则会出问题!!!(想了解具体的可以自行百度)

  1. IEnumerator Loadlev()//协程
  2. {
  3. AsyncOperation operation = SceneManager.LoadSceneAsync(SceneManager.GetActiveScene().buildIndex+1);//携程函数=加载下一个场景的编号
  4. operation.allowSceneActivation = false;//进度条加载完后不进行操作
  5. while (!operation.isDone)//如果没有完成
  6. {
  7. slider.value = operation.progress;//将 operation(当前进度)给滑动条赋值
  8. text.text = operation.progress*100+"%";//显示百分比
  9. if (operation.progress>=0.9f)//如果当加载进度大于等于0.9时执行
  10. {
  11. slider.value = 1;//进度条满
  12. text.text = "100%";//文本百分比为100
  13. operation.allowSceneActivation = true;//将进度条修改为加载完后进行跳转
  14. }
  15. yield return null;//暂缓一帧,在下一帧接着往下处理:注1、注2
  16. //yield return null(不管你return后面写的数字是多少执行的都一样)
  17. }
  18. }

现在我们的电脑配置通常比较好,所以一般情况下只有在下一个场景地图比较大,需要加载时间才会出现我们写的进度条,通常情况下直接嗖一下就过去了

注1:

为什么说yield return null后面写多少数字都一样?

答:因为这里本质上是返回第几帧,协程这里本质上是跳转场景,也就是说当前场景已经结束了它的任务,不会再有其它任务在此场景中执行,当场景开始发生跳转,此前场景不会再发生变化所以返回的帧数都会一样(效果一样,本质不同),这里返回在场景发生跳转时没有实际价值,因此返回null也行,返回数字(第几帧)也行。

基于协程特殊性质,(注意它与线程不同!!!),它更像是一种任务分配,让计算器(指的是CPU、GPU)在主协程中(就像C程序的main运行在主线程中),创建一个协程分配出一些计算算力给协程部分,让主程与协程同时在代码计算中运行,当协程计算完毕后,将计算完的结果返回主程。

还有一种用法用来拖延时间:yield return  new WaitForSeconds(3f);//延迟3秒执行

更多内容参见(没找到他是从哪里转载的):关于协程中yield return的一些使用_qq_38676887的博客-CSDN博客

注2:

 yield return null必须在while里面,且在

“ operation.allowSceneActivation = true;//将进度条修改为加载完后进行跳转”

之后,否则将会卡死,目前具体原因不详

你说是结束while吧,似乎不太严谨,笔者在浏览一些资料后认为这里起到两个作用

1.结束while的这个循环,并出现一个结果

2.将这一个结论返回协程

因此这个函数不能放在判断“>=0.9f”上面,否则就不会有if判断的结果了,这意味着“满足跳转”或者“不满足条件继续执行”这两个结果返回协程,还是希望有大佬能在评论区指正,在此表示感谢。

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

闽ICP备14008679号