セーブデータを独自拡張する
目次
概要
宴のセーブロード機能に、自分で拡張したデータを追加する方法です。
セーブロードをカスタムするには
・IAdvSaveDataインターフェースを使ったコンポーネントを作成し、その中にセーブロードの処理を書く
・そのコンポーネントをもつオブジェクトを、AdvEngine>SaveManager>CustomSaveDataObjectsに登録
という二点を行うだけです。
自分で作ったゲームのデータを宴の機能を使ってセーブすることも可能ですし、SendMessage、SendMessageByNameなどでプログラムを呼び出す方法とあわせて使えば、独自に拡張した演出などもセーブ可能になります。
サンプル
「広告の表示フラグ」を宴のシナリオデータから操作可能な形でセーブデータにも反映させるサンプルです。
インターフェースを使ったコンポーネントを作成
セーブロードの対象となるコンポーネントは、IAdvSaveDataインターフェースを使用する必要あります。
宴2まではIAdvCustomSaveDataIOは使用する必要があります。IAdvSaveDataと機能は同じです。
以下は、IAdvSaveDataインターフェースを実装したコンポーネントのサンプルです。
using UnityEngine; using Utage; using System.Collections; /// <summary> /// ADV用SendMessageByNameコマンドから送られたメッセージを受け取る処理のサンプル /// </summary> [AddComponentMenu("Utage/ADV/Examples/SendMessageByName")] public class SampleSendMessageByName : MonoBehaviour, IAdvSaveData { //広告のオンオフフラグなど public bool isAdOpen = false; //シナリオからコマンドを呼んで切り替える void SetEnableAdvertise(AdvCommandSendMessageByName command) { this.isAdOpen = command.ParseCellOptional<bool>(AdvColumnName.Arg3, false); } //セーブに使うキーは他のカスタムセーブデータを被らないように public string SaveKey { get { return "SampleSendMessageByName"; } } //クリアする public void OnClear() { this.isAdOpen = false; } //バージョンチェックしたほうが安全 const int Version = 0; //書き込み public void OnWrite(System.IO.BinaryWriter writer) { writer.Write(Version); writer.Write(this.isAdOpen); } //読み込み public void OnRead(System.IO.BinaryReader reader) { //バージョンチェック int version = reader.ReadInt32(); if (version == Version) { this.isAdOpen = reader.ReadBoolean(); } else { Debug.LogError(LanguageErrorMsg.LocalizeTextFormat(ErrorMsg.UnknownVersion, version)); } } }
コンポーネントを使ったオブジェクトを作成
新しいオブジェクトを作成し、作成したコンポーネントをAddComponentする
SaveManagerにオブジェクトを登録
作成したオブジェクトを AdvEngine>SaveManager>CustomSaveDataObjectsに登録。
シナリオから操作
SendMessgaeByNameコマンドなどを使って、シナリオから対象オブジェクトを操作します。
セーブロードを確認
実際にセーブロードが判定されるか確認してみましょう。
セーブのタイミング
宴のセーブは、基本的に「各ページの冒頭の状態」を、ページが切り替わるごとにバッググランドでオートセーブしています。
「セーブボタンを押したタイミング」ではないので、その点は注意してください。
これはなぜかというと「ロード後には、ページの冒頭から再開する」必要があるためです。
関連