Unity场景异步加载与加载进度条

异步加载场景分为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场景

你可能感兴趣的:(技术)