加载场景的功能想必在游戏开发中是十分常见的了。如果想从一个场景过渡到另一个包含资源较多的场景,必然需要等待一段时间,这时候就需要有一个滑动条来动态显示加载进度了。本案例提到三个场景:A(原始的场景)、B(加载场景)和C(想要切换到的场景)。当然,很多时候B场景是和A场景是合并的。
1.先写一个全局类,记录当前要切换场景的名称
public class Globe
{
public static string loadName;
}
2.在A场景中,执行如下脚本后,会瞬间过渡到B场景:
public class A : MonoBehaviour
{
void Start()
{
Globe.loadName = "C"; //记录Loading场景中 需要异步加载的场景名称
SceneManager.LoadScene("B"); //进入B场景
}
}
3.在B场景中,应该有进度条、进度百分比等UI,同时也可以配上自定义的动画。
该场景自动运行以下脚本:
public class AsyncLoadScene : MonoBehaviour
{
public Slider loadingSlider; //显示进度的滑动条
public Text loadingText; //显示进度的文本
public string SceneName;
private float loadingSpeed = 1;
private float targetValue;
private AsyncOperation async;
private void Start()
{
loadingSlider.value = 0.0f;
StartCoroutine(AsyncLoading());
}
IEnumerator AsyncLoading()
{
//异步加载场景
async = SceneManager.LoadSceneAsync(Globe.nextSceneName);
//阻止当加载完成自动切换
async.allowSceneActivation = false;
//读取完毕后返回,系统会自动进入C场景
yield return async;
}
void Update()
{
if (async == null) { return; }
targetValue = async.progress;
if (async.progress >= 0.9f)
{
//值最大为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)
{
//允许异步加载完毕后自动切换场景
async.allowSceneActivation = true;
}
}
}
更多unity2018的功能介绍请到paws3d爪爪学院查找。链接https://www.paws3d.com/learn/,也可以加入unity学习讨论群935714213
近期更有资深开发人士直播分享unity开发经验,详情请进入官网或加入QQ群了解