Unityの非同期ジャンプシーン丨過剰な空のシーン丨プログレスバーの過剰なシーン

序文

提示:大体介绍今日功能介绍
この記事では、シーンが大きすぎてジャンプやフリーズができないため、トランジション シーンを追加します。

作る

構造の紹介

  • この記事には 3 つのシナリオがあります
  • オリジナルシーンとジャンプ後のシーンにトランジションシーンが追加され、プログレスバーありバージョンとプログレスバーなしバージョンに分かれています。

過剰なシーン演出

  • コードの直接制作
  • まず、固定のシーン名を持つクラスを予備として定義します。これは後で直接使用されます。
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;
        }
    }

時計のバージョン

  • このバージョンでは、非同期シーンを比較的見栄えの良いシーンにしたり、自分のシーンと他のシーンのロゴを表示したりできます。
  • シーンが大きすぎることはお勧めしません
 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 が 3 番目のシーンの読み込みを完了するのを待ってから、過去にジャンプするように制御できます。

おすすめ

転載: blog.csdn.net/weixin_42746271/article/details/129088702