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)して、そこで次のシーンのインスタンスに今のシーンで渡したい値を渡すイベント関数を記述する