异步加载场景分为A、B、C三个场景
A场景是开始场景;B场景是加载场景(进度条加载显示);C场景是目标场景
在A场景中添加一个按钮
public void StartGameButton_OnClick()
{
//保存需要加载的目标场景
Global.nextSceneName = "01";
SceneManager.LoadScene("LoadingScene");
}
在B场景中添加一个脚本,挂载到Camera下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class LoadingScene : MonoBehaviour {
public Slider loadingSlider; //进度条控件
public Text loadingText;
private float loadingSpeed = 1;
private float progressValue;
private AsyncOperation AsyOper;
void Start () {
loadingSlider.value = 0; //初始进度条为0
if(SceneManager.GetActiveScene().name=="LoadingScene")
{
//启动协程
StartCoroutine("AsyncLoadingScenes");
}
}
IEnumerator AsyncLoadingScenes()
{
AsyOper = SceneManager.LoadSceneAsync(Global.nextSceneName);
//阻止当加载完成自动切换
AsyOper.allowSceneActivation = false;
yield return AsyOper;
}
void Update () {
progressValue = AsyOper.progress;
if(AsyOper.progress>=0.9f)
{
//AsyOper.progress的值最大为0.9
progressValue = 1.0f;
}
if (progressValue != loadingSlider.value)
{
//插值计算
loadingSlider.value = Mathf.Lerp(loadingSlider.value, progressValue, loadingSpeed * Time.deltaTime);
if(Mathf.Abs(loadingSlider.value- progressValue)<0.01f)
{
loadingSlider.value = progressValue;
}
}
loadingText.text = ((int)(loadingSlider.value * 100)).ToString() + "%";
if(loadingSlider.value==1.0f)
{
//允许异步加载完毕后自动切换场景
AsyOper.allowSceneActivation = true;
}
}
}
注意:使用AsyncOperation.allowSceneActivation属性来对异步加载的场景进行控制
为true时,异步加载完毕后将自动切换到C场景