Unity3D:异步加载场景资源进度条

如题所述

Unity3D中很多时候需要用到异步加载场景或资源.如异步打开一个非常大的场景;两个场景之间的一个过渡;游戏关卡的加载等等,通过添加一个进度条场景的方式可以很好的增强客户体验,并让客户了解场景的加载进程.本文主要介绍进度条场景的实现方法和异步加载AsyncOperation
场景搭建:任意建两个场景,分别命名为testScene1、testScene2,两个场景中分别设置"切换场景"按钮,便于立昂场景之间的相互切换,注意,两个切换按钮加载的的场景均是"loadScene";建loadScene场景,用于处理加载进度条.

导入NGUI资源包,在Unity3D菜单栏中选中NGUI-Open-Prefab Toolbar,在Prefab Toolbar窗口中,选中Control - Colored Progress Bar拖拽至Hierarchy面板,修改名字为"Loading";

在Hierarchy面板,Loading添加子物体Label,Label的Context内容为"loading",适当调整字体大小.创建脚本LoadingScripts,UI Root的摄像机Camera添加组件LoadingScripts

LoadingScripts脚本代码如图所示. objProcessBar.GetComponentUISlider().value = acOp.progress; 异步加载场景testScene2的速度直接决定了进度条的实际进展速度.

你会发现,加载场景loadScene一闪而过,迅速的就跳转到了场景testScene2.完全无法看到进度条进展的过程.原因是,场景loadScene太小,加载场景loadScene的时间非常非常短,此时用加载场景的速度来控制进度条的进展速度就会让加载场景失去它存在的意义.上述代码简单实用性强,非常适合加载大场景大资源等耗时长的情况

为了满足小资源/场景加载时也显示出进度条,使用如下图所示代码.AsyncOperation另一个重要的属性AsyncOperation.allowSceneActivation acOp.allowSceneActivation = false; acOp.allowSceneActivation = true; 当acOp.allowSceneActivation = false即使场景已经加载完成,也不会自动跳转,直到acOp.allowSceneActivation = true;

实验一下效果,进度条进展效果良好.仔细观察,进度条1%、2%、3%到100%,完全按照i++的代码设定执行.这时进度条的额进展速度与异步加载场景的速度无关

之所以能够得到满意的效果,每一个百分比的进度都能展示在我们眼前,是因为这个脚本中还有一个重要的语句.yield return new WaitForEndOfFrame();

将该语句移到while循环语句的大括号外面,再次运行Unity3D,看一下效果,你会发现,加载场景loadScene再次一闪而过.这是因为这里的while循环只处理了一个判断i 是否小于 100,一个i++,和一个赋值语句,电脑的执行速度是非常快的,快的有时人眼无法识别.这时 yield return new WaitForEndOfFrame();派上了大用场,每次复制完毕,都要等到帧渲染结束,才能进行下一次循环

赋值语句 objProcessBar.GetComponentUISlider().value = i / 100;每次赋值一次,Loading-Thumb-Label的数值就要改变一次,Loading-Overlay的显示面积也会改变一次,每次都要等这些帧渲染完毕,才能进行下一次的循环.yield return new WaitForEndOfFrame()就可以使进度条以肉眼可辨的速度进行变化
异步操作AsyncOperation只有四个属性(Unity圣典中只介绍了三个,还有一个属性是allowSceneActivation),灵活运用四个属性,才能得到想要的效果
温馨提示:答案为网友推荐,仅供参考
相似回答