データ・パーシステンス

確認済のバージョン: 2017.3

-

難易度: 初級

データ・パーシステンス・システム(データの持続性に関するシステム)は、ゲームプレイ中のデータの保存(セーブ)を可能にし、プレイヤーが何を既に完了したかの情報を維持できるようにする仕組みです。

各 Zone が新しいシーンになるため、このシステムがなければ、特定の Zone に入った時にその Zone が「初期設定の」状態(エディター内で設定されたそのままの状態)で読み込まれ、プレイヤーがそれまでに獲得した鍵や武器などが取り消されてしまいます。

エディター内での使用

このデータシステムは、IDataPersister と呼ばれるスクリプトインターフェースを介して機能します。

このインターフェースを実装しているオブジェクト(ビルトインの InventoryItem、HubDoor、PlayerInput など)は、PersistentDataManager のデータの書き込みと読み出しを行えます。

このインターフェースを実装した MonoBehaviour には、インスペクター下部に Data Settings の折り畳みメニューが表示されます。この設定には以下が含まれています。

  • Data Tag ― ゲームオブジェクトの固有識別子です。そのゲームオブジェクトへデータをリンクするためにマネージャーによって使用されます。一部のビルトインコンポーネントは自動生成される固有識別子を使用しますが、手動で名前を入力することもできます("Zone_3_key" や "Quest_Item_Card" など)。

  • Persistence Type ― データの持続性(パーシステンス)のタイプには以下の 4 種類があります。

    • Don't Persist ― パーシステンスを無効化します。シーンの切り替わり時にリセットされなければならないゲームオブジェクトに役立ちます(例えばステージの再開時には扉は閉まった状態に戻すなど)。

    • Read Only ― このタイプに設定されたゲームオブジェクトは、データの読み出しは行えますが書き込みは行えません。使い方として、同じ Data Tag を持つゲームオブジェクトの Write Only(下記参照)版を作るのもひとつの方法です。この Read Only のゲームオブジェクトは、もう一方の Write Only のゲームオブジェクトがその Data Tag 用に書くデータを使用しますが、それを上書きすることはできません。

    • Write Only ― このタイプに設定されたゲームオブジェクトは、データの書き込みは行えますが読み出しは行えません。ひとつ上の「Read Only」の説明をご覧ください。

    • Read Write ― 最も一般的に使用されるタイプです。このタイプに設定されたゲームオブジェクトは、設定された Data Tag でデータの読み出しと書き込みを行えます。

データ保存と読み込みのサイクル

SaveData は、シーンの遷移前に、そのシーン内の IDataPersister の全てのインスタンスに呼び出されます。

LoadData は、新しいシーンの読み込み後に、そのシーン内の IDataPersister の全てのインスタンスに呼び出されます。

どの IDataPersister でも、PersistentDataManager.SetDirty(this) を呼び出すことで、いつでもデータを手動で保存できます。

コード内での使用例

データマネージャーをコード内で使用するには、それが有効化された(あるいは開始された)時に関連のデータを読み出して、それに続く処理を実行させます。

例えば、インベントリアイテムは、その状態(アクティブあるいは非アクティブ)を持続データに書き込みます。したがって、シーンが読み込まれるとそのインベントリアイテムは、そのタグに関連付けられたデータを取得します。false 値が保存された場合、そのゲームオブジェクトは既に取得されており、したがって無効化できるということになります。

もうひとつの例は、状態を保存する扉です。シーンが読み込まれてデータが読み出された際に、扉が指定の状態(開いた状態・閉まった状態など)に自動的にリセットすることができます。