top of page

Unityでシーン遷移時のフリーズを防ぐ!リアルタイムなローディング表示の実装法(非同期読み込み)

Unityでゲーム開発をしていると、シーンを切り替えたときに「フリーズした?」とユーザーに思わせてしまう場面があります。特に Start() や Awake() で重たい処理をしていると、ローディングUIが描画される前に処理が始まり、真っ白な画面で数秒止まってしまうという事態に……。

今回は、スムーズなシーン遷移リアルタイムなローディングUIの表示を実現する方法をご紹介します。




よくある問題:Start() で処理が重いとUIが固まる


Unityの Start() や Awake() はシーンが切り替わった直後に自動的に実行されますが、このタイミングで重たい処理(オブジェクト生成、大量データの読み込みなど)を入れてしまうと、UIが表示される前に処理がスタートしてしまいます。

結果として、「真っ白な画面でフリーズしているように見える」状態になり、ユーザー体験が大きく損なわれてしまいます。




解決策:非同期読み込み+ローディングUI


ユーザーにローディング中だと明確に伝えるためには、以下の2つがカギになります。

  • シーンを非同期で読み込む

  • ローディング画面を先に表示して、重たい処理は後で行う



実装ステップ


Step1. ローディング画面のUIを作成

まず、Canvas 上に以下のようなローディングUIを配置しましょう。

  • 「Now Loading...」のテキスト

  • スピナーやアニメーション

  • 任意でプログレスバー(Slider)


Step2. 非同期でシーンを読み込むコード

using UnityEngine;

using UnityEngine.SceneManagement;

using UnityEngine.UI;

using System.Collections;


public class LoadingManager : MonoBehaviour

{

public GameObject loadingScreen;

public Slider progressBar;


public void LoadScene(string sceneName)

{

StartCoroutine(LoadAsynchronously(sceneName));

}


IEnumerator LoadAsynchronously(string sceneName)

{

loadingScreen.SetActive(true);


AsyncOperation operation = SceneManager.LoadSceneAsync(sceneName);


while (!operation.isDone)

{

float progress = Mathf.Clamp01(operation.progress / 0.9f);

progressBar.value = progress;

yield return null;

}

}

}


ここでは、SceneManager.LoadSceneAsync() を使って非同期で読み込みつつ、ローディングUIを表示しています。


Step3. 新しいシーンでも重い処理を非同期に

新しいシーンの Start() に直接重たい処理を書かず、Coroutineで段階的に処理を進めます。


public class GameSceneInitializer : MonoBehaviour

{

public GameObject loadingUI;


IEnumerator Start()

{

// まずローディングUIを表示

loadingUI.SetActive(true);

yield return null; // 1フレーム待ってUI描画


// 時間のかかる初期化処理

yield return StartCoroutine(HeavyInitialization());


// 完了したらローディングUIを非表示

loadingUI.SetActive(false);

}


IEnumerator HeavyInitialization()

{

// 例:データの読み込みや準備処理

yield return new WaitForSeconds(2f); // 仮の処理

}

}


yield return null を1フレーム挟むことで、UIが描画されてから重い処理が始まるようにできます。




おわりに

シーン遷移中の「フリーズ問題」は、しっかり対策しないとゲーム全体のクオリティに影響します。ユーザーに「ちゃんと動いてるよ!」と伝えるだけで、体感のストレスは大きく軽減できます。

ローディングの見せ方一つでゲームの印象が変わるので、ぜひ一工夫してみてください!




Step2. 非同期でシーンを読み込むコード

最新記事

すべて表示
個人開発ゲーム制作者の「あるある」20連発

こんにちは、アマギラスです。個人でゲーム開発をしているとふとしたタイミングでアイデアが思い浮かんだり、途端にやる気がなくなったり、嫌気がさしたり…色々ありますよね? そんなあるあるを20個ほどご用意しました。個人開発ゲーム制作者の「あるある」20連発少しでも共感していただけ...

 
 
bottom of page