unity异步场景加载
在Unity项目中,经常要用到异步场景加载:通常通过登录场景进入其他场景时、或者切换场景时,切换的场景资产非常多时,会出现卡顿的现象。你不可能让用户一直停留在你之前的场景,一直等待。
可以使用一个纯UI的场景进行过度,显示要切换场景加载的进度。
public class HuangControlLoading : MonoBehaviour
{
private Slider loadingSlider; //显示进度的滑动条
private Text loadingText; //显示进度的文本
private float loadingSpeed = 1; //滑动条的速度。
private float targetValue; //加载场景实际的进度
private AsyncOperation async; //加载的场景
private void Awake()
{
Init();
}
private void Start()
{
loadingSlider.value = 0.0f;
StartCoroutine(AsyncLoading());
}
/// <summary>
/// 进行初始化
/// </summary>
void Init()
{
loadingSlider = GameObject.Find("Slider").GetComponent<Slider>();
loadingText = GameObject.Find("DataText").GetComponent<Text>();
}
IEnumerator AsyncLoading()
{
//异步加载场景
async = SceneManager.LoadSceneAsync(HuangChoseScene.ChoseSceneName);
//阻止当加载完成自动切换
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;
}
}
}