セーブデータを独自拡張する


概要

宴のセーブロード機能に、自分で拡張したデータを追加する方法です。
セーブロードをカスタムするには
・IAdvCustomSaveDataIOインターフェースを使ったコンポーネントを作成し、その中にセーブロードの処理を書く
・そのコンポーネントをもつオブジェクトを、AdvEngine>SaveManager>CustomSaveDataObjectsに登録
という二点を行うだけです。

自分で作ったゲームのデータを宴の機能を使ってセーブすることも可能ですし、SendMessage、SendMessageByNameなどでプログラムを呼び出す方法とあわせて使えば、独自に拡張した演出などもセーブ可能になります。

サンプル

「広告の表示フラグ」を宴のシナリオデータから操作可能な形でセーブデータにも反映させるサンプルです。

IAdvCustomSaveDataIOインターフェースを使ったコンポーネントを作成

セーブロードの対象となるコンポーネントは、IAdvCustomSaveDataIOインターフェースを使用する必要あります。
IAdvCustomSaveDataIOインターフェース

以下は、IAdvCustomSaveDataIOインターフェースを実装したコンポーネントのサンプルです。

using UnityEngine;
using Utage;
using System.Collections;

/// <summary>
/// ADV用SendMessageByNameコマンドから送られたメッセージを受け取る処理のサンプル
/// </summary>
[AddComponentMenu("Utage/ADV/Examples/SendMessageByName")]
public class SampleSendMessageByName : MonoBehaviour, IAdvCustomSaveDataIO
{
    //広告のオンオフフラグなど
    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コマンドなどを使って、シナリオから対象オブジェクトを操作します。

セーブロードを確認

実際にセーブロードが判定されるか確認してみましょう。

セーブのタイミング

宴のセーブは、基本的に「各ページの冒頭の状態」を、ページが切り替わるごとにバッググランドでオートセーブしています。
「セーブボタンを押したタイミング」ではないので、その点は注意してください。
これはなぜかというと「ロード後には、ページの冒頭から再開する」必要があるためです。

関連