异步加载场景分为A、B、C三个场景
A场景是开始场景;B场景是加载场景(进度条加载显示);C场景是目标场景
在A场景中添加一个按钮,触发函数:
//异步加载新场景
public void LoadNewScene()
{
//保存需要加载的目标场景
Globe.nextSceneName = "Scene";
SceneManager.LoadScene("Loading");
}
在B场景中添加一个脚本(AsyncLoadScene),挂载到Camera下
using System.Collections;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class Globe
{
public static string nextSceneName;
/// <summary>
/// 异步加载场景
/// </summary>
/// <param name="sceneName">场景名字</param>
/// <param name="isAsync">是否使用异步加载</param>
public static void LodingScene(string sceneName, bool isAsync = true)
{
//清理Unity垃圾
Resources.UnloadUnusedAssets();
//清理GC垃圾
System.GC.Collect();
//是否使用异步加载
if (isAsync)
{
//赋值加载场景名称
nextSceneName = sceneName;
//跳转到LoadingScene场景
SceneManager.LoadScene("LoadingScene");
}
else
{
SceneManager.LoadScene(sceneName);
}
}
}
/// <summary>
/// 异步加载脚本
/// </summary>
public class AsyncLoadScene : MonoBehaviour
{
public Slider loadingSlider;
//public Text Tips;
//public Text loadingText;
//private float loadingSpeed = 1;
//private float targetValue;
private AsyncOperation operation;
private int displayProgress;
private int toProgress;
void Start()
{
loadingSlider.value = 0;
loadingSlider.maxValue = 100;
if (SceneManager.GetActiveScene().name == "LoadingScene")
{
//启动协程
StartCoroutine(AsyncLoading());
}
}
private IEnumerator AsyncLoading()
{
operation = SceneManager.LoadSceneAsync(Globe.nextSceneName);
operation.allowSceneActivation = false;
while (operation.progress < 0.9f)
{
toProgress = (int)operation.progress * 100;
while (displayProgress < toProgress)
{
++displayProgress;
SetLoadingPercentage(displayProgress);
yield return new WaitForEndOfFrame();
}
}
toProgress = 100;
while (displayProgress < toProgress)
{
++displayProgress;
SetLoadingPercentage(displayProgress);
yield return new WaitForEndOfFrame();
}
operation.allowSceneActivation = true;
}
private void SetLoadingPercentage(int Percentage)
{
loadingSlider.value = Percentage;
//loadingText.text = Percentage + "%";
}
}
这里需要注意的是使用AsyncOperation.allowSceneActivation属性来对异步加载的场景进行控制
为true时,异步加载完毕后将自动切换到C场景
最后附上效果图