在Loading界面切换的时候,不仅需要用到异步加载,更需要用进度条来表示切换的进度。今天我就来介绍一下,何如制作“音之国度”中的过渡页面进度条。
首先,我们当然先需要得到一个进度条(滑稽)。
制作一个进度条有两种比较简单的方法。
1、在NGUI中,已经存在ProgressBar的预设体,所以求省事的同学,可以直接把该预设体拖入游戏窗口内,就可以得到一个进度条。
如图为NGUI预设的进度条。
2、可以自己手动制作一个进度条,这需要我们以以下的格式创建几个Sprite,有必要的话,再加上两个label用于表示进度和Loading的状态。
其中,Sprite_front用于表示进度条中可变的部分。Sprite_back用于表示进度条的背景。
分别给两个Sprite设置图片即可。
设置完以后可以得到如下一张图:
但这时候进度条还仅仅只是有了一个雏形,还需要让它变成一个动态的组件。这时候为Sprite_ProcessBar添加上NGUI Slider的脚本。然后将front和back分别拖入对应的位置。
将label拖入On Value Change中的Notify位置中,选择SetCurrentProcess选项,就可以把这个你自己制作的进度条变成动态的了。
好了,这样我们就得到了我们需要的进度条,接下来要做的就是让进度条和游戏画面的跳转结合在一起。
要达到异步加载场景资源的功能,需要开启一个异步的任务。
void Start()
{
//在这里开启一个异步任务,
//进入loadScene方法。
StartCoroutine(loadScene());
}
在脚本的Start方法中,使用StartCoroutine的方法,参数为开启协程所调用的方法。
要注意与StartCoroutine对应的还有 Yield和Yield return的方法。协程可以在任何地方用yield来暂停,用yield return来标记协程何时继续进行。
因为我们的场景中要加载的资源比较少,所以加载场景可能闪过地很快,甚至不容易观察到。为了方便观察,所以我们控制了加载场景加载的速度。
IEnumerator loadScene()
{
//异步读取场景。
//Globe.loadName 就是A场景中需要读取的C场景名称。
float i = 0;
AsyncOperation acOP = Application.LoadLevelAsync("DemoScene");
acOP.allowSceneActivation = false;
while (i <= 500)
{
i++;
objProcessBar.GetComponent<UISlider>().value = i / 500;
yield return new WaitForEndOfFrame();
}
acOP.allowSceneActivation = true;
}
要注意这里AsyncOperation,异步操作对象acOp,异步加载的场景是“DemoScene”。
acOP.allowSceneActivation表示控制加载的场景是否激活,若激活则跳转到该场景。
除此之外,还有AsyncOperation.process用来表示加载的进度,isDone函数用来表示加载是否完成。
**要能够成功加载出来,必须在Build Setting里面将两个场景放在一起。
将该脚本挂到加载场景的相机上即可。