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


概要

宴のセーブロード機能に、自分で拡張したデータを追加する方法です。
セーブロードをカスタムするには、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からは自動的に登録されるので不要です。

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

作成したオブジェクトを AdvEngine>SaveManager>CustomSaveDataObjectsに登録。

シナリオから操作

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

セーブロードを確認

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

セーブのタイミング

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

関連