场景异步加载
版权声明:本文为博主原创文章,未经博主允许不得转载。blog.liujunliang.com.cn https://blog.csdn.net/qq_33747722/article/details/72582213
异步加载场景分为A、B、C三个场景
A场景是开始场景;B场景是加载场景(进度条加载显示);C场景是目标场景
在A场景中添加一个按钮,触发函数:
//异步加载新场景
public void LoadNewScene()
{
//保存需要加载的目标场景
Globe.nextSceneName = "Scene";
SceneManager.LoadScene("Loading");
}
在B场景中添加一个脚本,挂载到Camera下
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class Globe
{
public static string nextSceneName;
}
public class AsyncLoadScene : MonoBehaviour
{
public Slider loadingSlider;
public Text loadingText;
private float loadingSpeed = 1;
private float targetValue;
private AsyncOperation operation;
// Use this for initialization
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;
}
// Update is called once per frame
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;
}
}
}
这里需要注意的是使用AsyncOperation.allowSceneActivation属性来对异步加载的场景进行控制
为true时,异步加载完毕后将自动切换到C场景
最后附上效果图
---------------------
作者:即步
来源:CSDN
原文:https://blog.csdn.net/qq_33747722/article/details/72582213
版权声明:本文为博主原创文章,转载请附上博文链接!