同期的にシーンを読み込む
同期的にシーンを読み込むやつです。手間が少なく簡単です。
void Update() { if (Input.GetKeyDown(KeyCode.RightArrow)) { // シーンを読み込む SceneManager.LoadScene("SceneTest"); } }
非同期でシーンを読み込む
非同期でシーンを読み込む方法です。
AsyncOperationクラスを使うことにより、読み込みの進捗を表示したりもできます。 プログレッシブバーを作りたい場合はこっちですね。
void Update() { if (Input.GetKeyDown(KeyCode.RightArrow)) { // 次のシーンへ StartCoroutine("LoadScene"); } } IEnumerator LoadScene() { AsyncOperation asyncLoad = SceneManager.LoadSceneAsync("SceneTest"); asyncLoad.allowSceneActivation = false; while (true) { yield return null; // 読み込み完了したら if(asyncLoad.progress >= 0.9f) { // シーン読み込み asyncLoad.allowSceneActivation = true; break; } } }
AsyncOperationクラスにはisDoneという、シーン読み込みが完了しているか確認できるbool型がありますが、
シーン遷移が完了してからtrueになるみたいなので注意が必要です。
isDoneがtrueになったら、allowSceneActivationをtrueにする。といった処理をしてしまうとずっとシーン遷移できないです。
上記コード内の
if(asyncLoad.progress >= 0.9f)
の部分が 0.9f以上となっている部分も気を付けたいですね。
ローディング画面の実装
Test.cs
void Update() { if (Input.GetKeyDown(KeyCode.RightArrow)) { // シーンを読み込む loadSceneManager.LoadScene("PolygonScfiCity Demo"); } }
LoadSceneManager.cs
[SerializeField] GameObject canvas; [SerializeField] Slider slider; /// <summary> /// シーンを読み込む /// </summary> /// <param name="name"></param> public void LoadScene(string name) { // コルーチンでロード画面を実行 StartCoroutine(LoadSceneExecute(name)); } IEnumerator LoadSceneExecute(string name) { AsyncOperation asyncLoad = SceneManager.LoadSceneAsync(name); asyncLoad.allowSceneActivation = false; // スライダーの値更新とロード画面の表示 slider.value = 0f; canvas.SetActive(true); while (true) { yield return null; slider.value = asyncLoad.progress; if(asyncLoad.progress >= 0.9f) { slider.value = 1f; asyncLoad.allowSceneActivation = true; // ロードバーが100%になっても1秒だけ表示維持 yield return new WaitForSeconds(1f); break; } } // ロード画面の非表示 canvas.SetActive(false); }
© Unity Technologies Japan/UCL
コメント
[…] https://nopitech.com/2019/05/22/post-1230/ […]