tsugaru’s blog

主に技術的なことをつぶやきます。プログラミング,ポケモンGO,音楽,アニメ等

Unityにおけるシーン遷移についてのメモ

Unityは初心者です。 自分のメモのため、シーン遷移について残しておきます。本来は公式ドキュメントをリンクとすべきですが、サボっています。

UnityにおいてSceneManager.LoadSceneをすると、デフォルトのモードがLoadSceneMode.Singleのため、遷移前のシーンの全てのオブジェクトは破棄されます。遷移後のシーンは毎度新しくインスタンスが作成されます。 そのため、値を保持する時、工夫が必要です。複数調べたのでまとめます。 一口にデータ保存と言っても、そのデータの特性からよりよい実装が異なると考えられます。

静的フィールドによる保持

よーく考えてから使うべき。

シングルトンパターンの使用

Managerオブジェクト的なものを用意してそのオブジェクトをDontDestroyOnLoadする。するとシーン遷移が怒ってもそのオブジェクトは破棄されない。元のシーンに戻ってくると、このオブジェクトのインスタンスが再生成されてしまう。そこで、初めてインスタンスが生成された時、そのインスタンスの参照をstaticで持つことで、複数生成を防ぐロジックを作成する。これは結局シングルトンパターンの実装方法となる。 https://gametukurikata.com/basic/scriptableobject https://gametukurikata.com/program/scriptableobjectitemdatabase

シーンを上書きするような方法

あまりなさそうだが、LoadSceneでSimpleでなくAddモードで行う。これは元のシーンの全オブジェクトを非アクティブにすれば良さそうだが、、、メモリが無駄。

PlayerPresで保存する

これはUnityを終了しても保持される。セーブ機能として使われる領域。 https://gametukurikata.com/program/data

ScriptableObjectを継承したインスタンスの使用

このスクリプトを作ると、Monobehaviourと異なり、アセットとしてインスタンスを作成する。ただし、インスタンスの作成についてはUnityのシリアライズ機構を経由するためにnewではなく、ScriptableObject.CreateInstanceで作成する。アセットとして保存するにはAssetDatabase.CreateAssetを用いて、拡張子に.assetsを指定する。簡単に行うには、CreateAssetMenu属性を使う。 Scriptableインスタンスへの参照を何らかの方法で取得することにより、シーンで使うことが可能。方法としては、.assetsファイルの参照(インスタンスの参照)をSerializedFieldを用いて渡したり、AssetDatabase.LoadAssetAtPathでロードする方法がある。 49.233.81.186

ロードのタイミングで前のシーンのデータを次のシーンに渡すイベント関数を使用する

SceneManagerのSceneLoadedにイベント関数を追加(引数はnextScene,LoadSceneMode)して、そこで次のシーンのインスタンスに今のシーンで渡したい値を渡すイベント関数を記述する

https://note.com/suzukijohnp/n/n050aa20a12f1