天天看點

Unity異步跳轉場景丨過度空場景丨進度條過度場景前言制作

Unity異步跳轉

  • 前言
  • 制作
    • 結構介紹
    • 過度場景制作
      • 進度條版本
      • 觀賞版本
    • 使用方法
    • 結果

前言

提示:大體介紹今日功能介紹

本文為了場景太大跳轉卡頓所增加一個過度場景

制作

結構介紹

  • 本文共有三個場景
  • 原本的場景和跳轉後的場景增加一個過度時的場景,場景分為有進度條和無進度條版本。

過度場景制作

  • 代碼直接制作
  • 首先我們定義一個固定的場景名字使用的類備用,稍後直接使用
public class AppDefine
{
    public static string nextSceneName;
}
           
  • 異步的部分

進度條版本

  • 本文選擇可以直接選擇添加一個可視化的進度條版本
  • 本場景名為AsyncLoadScene
public Slider loadingSlider;  //加載場景進度條,B場景中使用UGUI實作

    public Text loadingText;  //顯示加載進度 %

    private float loadingSpeed = 1;  //加載速度,這裡是進度條的讀取速度

    private float targetValue;  //進度條目标的值/異步加載進度的值
    private float operation = 3.0f;
    private AsyncOperation asyncLoad;  //定義異步加載的引用

    // Use this for initialization  
    void Start()
    {
        //loadingSlider.value = 0.0f;  //初始化進度條

        if (SceneManager.GetActiveScene().name == "AsyncLoadScene")  //如果目前活動場景是B
        {
            //啟動協程  
            StartCoroutine(AsyncLoading());  //開啟協程進行異步加載
        }
        
    }

    IEnumerator AsyncLoading()
    {
        asyncLoad = SceneManager.LoadSceneAsync(AppDefine.nextSceneName);
        //阻止當加載完成自動切換
        asyncLoad.allowSceneActivation = false;
        yield return null;

    } // Update is called once per frame 

    void Update()
    {
        targetValue = asyncLoad.progress;
        if (asyncLoad.progress >= 0.9f)
        {
            //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)
            //如果目前進度條value和目标值接近 設定進度條value為目标值 
            { loadingSlider.value = targetValue; }
        }
        loadingText.text = ((int)(loadingSlider.value * 100)).ToString() + "%"; if ((int)(loadingSlider.value * 100) == 100)
        //當進度條讀取到百分之百時允許場景切換 
        { //允許異步加載完畢後自動切換場景 
            asyncLoad.allowSceneActivation = true;
        }
    }
           

觀賞版本

  • 這個版本可以把異步場景制作為一個相對好看,或者帶我們本場景的logo展示等場景
  • 場景不建議過于太大
private float loadingSpeed = 1;  //加載速度,這裡是進度條的讀取速度

    private float targetValue;  //進度條目标的值/異步加載進度的值
    private float operation = 3.0f;
    private AsyncOperation asyncLoad;  //定義異步加載的引用

    // Use this for initialization  
    void Start()
    {
        //loadingSlider.value = 0.0f;  //初始化進度條

        if (SceneManager.GetActiveScene().name == "AsyncLoadScene")  //如果目前活動場景是B
        {
            //啟動協程  
            StartCoroutine(AsyncLoading());  //開啟協程進行異步加載
        }

    }

    IEnumerator AsyncLoading()
    {
        asyncLoad = SceneManager.LoadSceneAsync(AppDefine.nextSceneName);
        //阻止當加載完成自動切換
        asyncLoad.allowSceneActivation = false;
        yield return null;

    } // Update is called once per frame 

    void Update()
    {
        targetValue = asyncLoad.progress;
        if (asyncLoad.progress >= 0.9f)
        {
            //progress的值最大為0.9 
            targetValue = 1.0f;
        }

        asyncLoad.allowSceneActivation = true;

    }
           

使用方法

  • 使用方法非常簡單
  • 我們直接首先控制我們建立的單獨的類AppDefine中的下一個場景需要跳轉的場景修改
  • 然後按照我們正常使用的跳轉即可
  • 因為我們的異步場景并不是很大,是以會跳轉的非常快
public void LoadNewScene()
    {
        //儲存需要加載的目标場景  
        AppDefine.nextSceneName = "原本需要跳轉的相對較大的場景";

        SceneManager.LoadScene("AsyncLoadScene");
    }
           

結果

最後就是我們可以使用某種媒體控制我們開始跳轉,跳轉到我們的異步的過度場景,在場景中等待時間,等待我們的Unity把第三個場景加載完成,則即可跳轉過去。