以下のようなスクリプトで、シーンの非同期ロード及び、切り替えを実装してみましたが、ロードの進行中に、ロード画面で表示されているアニメーションがカクついてしまいます。

ロード画面であれば、工夫次第でカクつきが気にならないデザインも可能だと思いますが、例えば、ゲームの進行中にバックグラウンドでのシーンのロードをしたい場合には、プレイに影響が出てしまいます。

いろいろ調査したところ、Coroutine
は結局メインスレッドで実行されている為、シーンの描画に影響が出てしまっているのではと考え、マルチスレッドでロードを実行する方法について調査しました。

しかし、UniRx にしろ、UniTask にしろ、JobSystem にしろ、Unity API
をメインスレッド以外で実行することは不可能であるという結論に至りました。

せめてロードの負荷を分散できないかと、Coroutine 内でロード進行度に応じて制御を返す方法も考えましたが、AsyncOperation
等に、ロードを中断する API は存在しないようでした。

Unity において、ゲームの進行中にバックグラウンドでのシーンロードを行う方法はないのでしょうか？

**現状のコード:**

```

    using UnityEngine;
    using UnityEngine.UI;
    using UnityEngine.SceneManagement;
    using System.Collections;
    
    public class SceneHandler : MonoBehaviour
    {
        [SerializeField] Button nextScene = default;
    
        private AsyncOperation asyncLoad;
    
        void Start()
        {
            nextScene.onClick.AddListener(SceneTransition); // ボタンを押すとシーン遷移開始
            DisplayLoading();                               // ロード画面の表示
            StartCoroutine(LoadScene());                    // 非同期ロードの開始
        }
    
        private IEnumerator LoadScene()
        {
            asyncLoad = SceneManager.LoadSceneAsync(1);     // 次のシーンの非同期ロード開始
            asyncLoad.allowSceneActivation = false;         // シーン遷移無効化
    
            while (asyncLoad.progress < 0.9f)               // ロードが完了するまで 3 秒待機を繰り返す
            {
                yield return new WaitForSeconds(3);
            }
    
            DisplayNext();                                  // ロード完了したら次の画面を表示
        }
    
        private void SceneTransition()
        {
            asyncLoad.allowSceneActivation = true;          // シーン遷移有効化
        }
    
        private void DisplayLoading()
        {
            // ロード画面の描画
        }
    
        private void DisplayNext()
        {
            // ロード完了後画面の描画
        }
    }
    
```
CC BY-SA 4.0
2021-08-27T08:45:33.890
81073
2021-08-27T17:02:17.477
2021-08-27T17:02:17.477
3060
47940
question
unity3d
シーンの非同期ロード(SceneManager.LoadSceneAsync())時のカクつきを解消したい