シーンの切り替えで引数を文字列にしなくてもいい方法

初歩の書籍や情報では、Unityでシーンの切り替えをする場合には、シーン名(文字列)を引数としていると思います。しかし、文字列を引数にすると綴のミスで実行時エラーになってしまいますし、直接文字列を入力するので融通が効かなくなります(マジックワードと呼ばれます)

よくある文字列を引数とするシーン切り替えのサンプル

NextSceneというシーン名に遷移したい場合、文字列を引数として次のように記述します
作成されたシーンをプロジェクトウィンドウからインスペクターにドラッグ&ドロップして接続することはできません

SceneManager.LoadScene("NextScene");

シーンを直接インスペクターに代入できるサンプル

この方法で、プロジェクトウィンドウのSceneアセットのインスペクターへの登録ができるようになります

事前準備

PackageManagerから、Addressablesをインストールします
WindowメニューからPackageManagerを選択すると次のウィンドウが表示されます
バージョンは、2022/01/06現在のもの(最新版をインポートしましょう)

遷移するシーンをプロジェクトウィンドウからインスペクターにドラッグ&ドロップできます

コードは次のようになります

using UnityEngine;
using UnityEngine.AddressableAssets;

public class SceneChanger : MonoBehaviour
{
    [SerializeField]
    AssetReference nextScene;

    void Start()
    {
        Addressables.LoadSceneAsync(nextScene).WaitForCompletion();
    }
}

使っている機能

Addressablesを使っています
本来は、特徴に示す通りサーバから更新データの取得や新しいシーン、画像、サウンドの取得など、アプリのコードを変更することなく情報の更新を行うために使われます

特徴

  • コードが実行された時にメモリにロードされるため、メモリの圧迫を削減できます(特にデータが大きい、多い時に効果あり)
  • コードを変更することなく、データの入れ替えが行えます
  • リモートサーバからデータをダウンロードできるような設定にできます
  • シーンの他、プレファブ、スプライト、サウンドなどアセット(素材)を同様に管理することができます
  • シーンやプレファブなどの場合、ゲームオブジェクト、各コンポーネント(メッシュやシェーダー、アニメーション等)も含まれていることがありますが、その依存関係も考慮したロードを行います
  • データは適切にパッキングされます。アプリケーションから切り離されるので、アプリケーションのサイズが小さくなります

参考

ドキュメント

ランタイムメモリ管理

UnityでAsset Bundleからロードする主な利点は、不要になったコンテンツをメモリから効率的にアンロードする手段を提供することです。何がロードされ、何が安全にアンロードされたかを効果的に追跡することは、これまで開発者に委ねられていた複雑なコーディング作業です。Addressables を通してロードすると、ロードされたアセットとその依存関係の高レベルな参照カウントが自動的に行われ、使用しなくなったバンドルとその関連アセットを自動的にアンロードすることができます。さらに、Addressables は、ロードされたアセットと Asset Bundle の参照カウントをリアルタイムにデバッグするためのビジュアルプロファイラを提供します。

Unity

Posted by hidepon