Unityでシーン遷移時のフリーズを防ぐ!リアルタイムなローディング表示の実装法(非同期読み込み)
- Amagirasu
- 5月14日
- 読了時間: 3分
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が描画されてから重い処理が始まるようにできます。
おわりに
シーン遷移中の「フリーズ問題」は、しっかり対策しないとゲーム全体のクオリティに影響します。ユーザーに「ちゃんと動いてるよ!」と伝えるだけで、体感のストレスは大きく軽減できます。
ローディングの見せ方一つでゲームの印象が変わるので、ぜひ一工夫してみてください!