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


投稿日:2015年9月29日 | 最終更新日:2024年5月18日

概要

宴のセーブロード機能に、自分で拡張したデータを追加する方法です。
セーブロードをカスタムするには、IAdvSaveDataインターフェースを使ったコンポーネントを作成し、その中にセーブロードの処理を書く必要があります。

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

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

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

IAdvSaveDataインターフェース

以下は、IAdvSaveDataインターフェースを実装したコンポーネントのサンプルです。
(「広告の表示フラグ」を宴のシナリオデータから操作可能な形でセーブデータにも反映させるサンプルです)

using UnityEngine;
using Utage;
using System.Collections;

/// ADV用SendMessageByNameコマンドから送られたメッセージを受け取る処理のサンプル
[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にオブジェクトを登録

オブジェクトがAdvEngin以下にある場合、

(Version4.0.5以降)
IAdvSaveDataを継承したコンポーネントがAdvEngine以下にあるコンポーネントの場合は自動的にセーブ対象になります。

オブジェクトがAdvEngin以下にない場合、

IAdvSaveDataを継承したコンポーネントがAdvEngine以下にない場合は、Adv Save ManagerコンポーネントののCustom Save Data Objectsに設定する必要があります。

シナリオから操作

SendMessgaeByNameコマンドなどを使って、シナリオから対象オブジェクトを操作します。

セーブロードを確認

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

セーブのタイミング

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

関連