赞
踩
本文结合unityAPI书写综合,并且但不限于网络相关内容资料整合而成。
其中的变量:
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”
然后我们开始操作,代码如下:
- using UnityEngine.SceneManagement;//添加引用的
- using UnityEngine.UI;//添加引用的
-
- public Button but;//声明了一个按钮
- public GameObject obj;//声明了一个对象
- public Slider slider;//声明了一个进度条
- public Text text;//显示文字
ok,那么到这里先来说说我要做什么
点击面板中的一个“按钮”,然后会出来一个“进度条”进行加载,在加载的时候会显示一个“text的百分比”,接着就加载到另一个场景中了。
然后我在“Start”函数当中做了个按钮点击
- but.onClick.AddListener(() =>
- {
- obj.SetActive(false);//隐藏按钮面板
- this.gameObject.SetActive(true);//显示进度条面板
- Loadybjz();//调用异步加载函数
- });
接着我在里面只写了
- public void Loadbjz()
- {
- StartCoroutine(Loadlev());//开始协同程序
- }
这里请注意不要写在Update之类的函数当中,否则会出问题!!!(想了解具体的可以自行百度)
- IEnumerator Loadlev()//协程
- {
-
- AsyncOperation operation = SceneManager.LoadSceneAsync(SceneManager.GetActiveScene().buildIndex+1);//携程函数=加载下一个场景的编号
- operation.allowSceneActivation = false;//进度条加载完后不进行操作
- while (!operation.isDone)//如果没有完成
- {
- slider.value = operation.progress;//将 operation(当前进度)给滑动条赋值
- text.text = operation.progress*100+"%";//显示百分比
-
- if (operation.progress>=0.9f)//如果当加载进度大于等于0.9时执行
- {
- slider.value = 1;//进度条满
- text.text = "100%";//文本百分比为100
- operation.allowSceneActivation = true;//将进度条修改为加载完后进行跳转
- }
-
- yield return null;//暂缓一帧,在下一帧接着往下处理:注1、注2
- //yield return null(不管你return后面写的数字是多少执行的都一样)
- }
- }
现在我们的电脑配置通常比较好,所以一般情况下只有在下一个场景地图比较大,需要加载时间才会出现我们写的进度条,通常情况下直接嗖一下就过去了
注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判断的结果了,这意味着“满足跳转”或者“不满足条件继续执行”这两个结果返回协程,还是希望有大佬能在评论区指正,在此表示感谢。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。