Unityで複数のシーンを利用するアプリを作成した際、他のシーンに比べて顕著に読み込みが遅いシーンがあった場合に確認するとよいであろう点を個人的な体験から紹介します。
Assetの読み込み方式やサイズを変更する
Unityで読み込みに時間がかかる場合、大抵問題となっているのはシーンで読み込む画像や音声などのAssetファイルであることが多いです。まず、これらから余計なものを読み込む設定が含まれていないかどうか確認します。必要なファイルだけになったら、ファイルごとの読み込み方式などをチェックしましょう。
例えば、音楽など比較的容量の大きな音声ファイルは"Load Type"を適切なものにしなければ余計なロード時間が発生してしまいます。シーンを読み込む直前で数分の音楽を一度に読み込もうとすれば、数秒アプリが操作できない時間ができてしまうかも知れません。
長い音楽などは"Load Type"を Streaming にしたり、"Load In Background"のオプションを活用すると良いでしょう。
スプライトやUIなどに使用する画像ファイル(テクスチャ)は、余計な大きさのものを読み込もうとするとロスタイムが生じるかも知れません。Unityには元のファイルを変更せず、読み込む画像サイズのみを変更する仕組みがあります。
テクスチャのインスペクターを開き、"Max Size"を変更して必要最低限の大きさに調節してみましょう。
元ファイルは変更されていませんが、Unity内においてサイズが削減されます。
プロジェクト設定の見直し
プロジェクト全体の設定(Project Settings)には、グラフィックや物理挙動、アプリのクオリティなどの項目があります。必要以上に高品質な設定になっていないか確かめてみましょう。
シーンの読み込みは非同期(Async)を使う
シーン管理クラス(SceneManager)にある読み込みメソッドには SceneManager.LoadScene と SceneManager.LoadSceneAsync があります。
前者はシーンを読み込んでいる間は完全に画面が停止し、入力も受け付けなくなってしまうため、ユーザーはアプリがフリーズしたと誤解してしまう恐れがあります。単純に反応が悪いとストレスを与えてしまうことにもなりかねません。
従って、後者の LoadSceneAsync を使って、読み込み時間にシーンをロードしていることを知らせるインジケータを表示すると良いでしょう。シーンロードの時間には直接影響しませんが、利用者にとって親切な設計になると思います。
以下のコードは LoadSceneAsync によってシーンを読み込んでいる間にインジケータをアニメーションさせる例です。
public void GoToMenu() { indicator.SetActive(true); StartCoroutine(LoadSceneAsync()); } IEnumerator LoadSceneAsync() { AsyncOperation asyncLoad = SceneManager.LoadSceneAsync(menuSceneName); while (!asyncLoad.isDone) { // シーンの読み込みが終わるまでインジケータを表示し回転させる indicator.transform.Rotate(Vector3.back, 2); yield return null; } }