在游戏开发过程中,常常需要Loading界面。一方面是为了等待后台加载场景;一方面也是为了美观,可以在Loading界面放上游戏里有趣的截图,战斗场面,小提示等。自己最近做的毕业设计中使用了场景的异步加载来使游戏变得更加完整和有趣,这些api用的比较少,所以代码贴上来记录一下。
/*
* 所属层级:工具层
* 脚本功能:异步加载场景
*
*
*/
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class AsyncLoadScene : MonoBehaviour
{
public Slider loadingSlider; //loading滑动条
public Text loadingText; //显示百分比
private float loadingSpeed = 1; //load速度
private float targetValue;
private AsyncOperation operation; //异步操作
void Start()
{
loadingSlider.value = 0.0f;
if (SceneManager.GetActiveScene().name == "Loading")
{
//启动协程
StartCoroutine(AsyncLoading());
}
}
IEnumerator AsyncLoading()
{
operation = SceneManager.LoadSceneAsync(Globe.nextSceneName);
//阻止当加载完成自动切换
operation.allowSceneActivation = false;
yield return operation;
}
void Update()
{
targetValue = operation.progress;
if (operation.progress >= 0.9f)
{
//operation.progress的值最大为0.9
targetValue = 1.0f;
}
if (targetValue != loadingSlider.value)
{
//插值运算
loadingSlider.value = Mathf.Lerp(loadingSlider.value, targetValue, Time.deltaTime * loadingSpeed);
if (Mathf.Abs(loadingSlider.value - targetValue) < 0.01f)
{
loadingSlider.value = targetValue;
}
}
loadingText.text = ((int)(loadingSlider.value * 100)).ToString() + "%";
if ((int)(loadingSlider.value * 100) == 100)
{
//允许异步加载完毕后自动切换场景
operation.allowSceneActivation = true;
}
}
}
在使用阶段:
Globe.nextSceneName = "003_Fight";
SceneManager.LoadScene("Loading");
只需要设置好下一个要加载的场景,然后直接加载Loading界面,在下一个场景准备好之后就会跳转。