ゲームデータについて(8)テキストデータの差し替え処理のつづき

前記事のサンプルコードについて簡単に解説し、使用例も紹介します。

差し替えタイプとタグの定義
    // 差し替えタイプ.
    private enum REPLACE_TYPE
    {
        NUMBER = 0, // 数値.
        STRING,     // 文字列.
        MONSTER,    // モンスター名.

        NUM
    };
    // 差し替えタグ.
    private static string[] replaceTags =
    {
        "{NUM}",
        "{STR}",
        "{MONSTER}",
    };

差し替える内容として数値・任意の文字列・モンスター名を差し替えタイプとして定義し、各タイプのタグ文字列を定義します。

差し替えパラメータとカウンタ
    // 差し替えパラメータ.
    private static List<int> replaceNumParams = new List<int>();
    private static List<string> replaceStrParams = new List<string>();
    private static List<int> replaceMonsterParams = new List<int>();

    // 差し替えカウンタ(タイプ毎の配列).
    private static byte[] replaceCount = new byte[(int)REPLACE_TYPE.NUM];

差し替える文字列は差し替えパラメータとして一時的にメンバに格納されます。
数値はint,文字列はstring.モンスター名はint(モンスターID)として一つのテキストにつき複数保持できるようにListにします。
また、処理途中に何番目のパラメータを処理しているかの情報としてカウンタを保持します。

差し替えパラメータ・差し替えカウンタのクリア処理
    public static void ClearReplaceParams()
    {
        replaceNumParams.Clear();
        replaceStrParams.Clear();
        replaceMonsterParams.Clear();
    }

    private static void ClearReplaceCounter()
    {
        for (int i = 0; i < (int)replaceCount.Length; ++i)
        {
            replaceCount[i] = 0;
        }
    }

差し替えパラメータは差し替え処理が終わったら不要になるので差し替え後に必ず呼ばれるようにします。
一方差し替えカウンタは差し替え処理が始まる前にクリアされる必要があるので処理前に呼ばれます。

差し替えパラメータの設定
    public static void SetNumber(List<int> nums)
    {
        replaceNumParams = nums;
    }

    public static void SetString(List<string> strings)
    {
        replaceStrParams = strings;
    }

    public static void SetMonster(List<int> ids)
    {
        replaceMonsterParams = ids;
    }

差し替えパラメータを設定する処理です。
テキストデータを取得する際にGetTextを呼ぶ前に呼ばれる想定です。

文字列の差し替え処理
    private static void ReplaceText(ref string strText)
    private static int ReplaceTextSub(ref string strText, REPLACE_TYPE replaceType, int index)

文字列の差し替え処理としてGetTextの中から呼ばれます。
ReplaceTextで引数として渡された文字列を走査してタグを見つけたらサブルーチンであるReplaceTextSubを呼びます。
ReplaceTextSub内でタグが差し替えパラメータに応じた文字列に差し替えられ、差し替えた文字列の長さを返します。
ReplaceTextはReplaceTextSubが返した文字列数分進めた状態で走査を続行します。

使用例
    // 数値の差し替え.
    TextDataManager.SetNumber(new List<int> { 100, 200 });
    Debug.Log(TextDataManager.GetText(TEXT_LABEL.SYSTEM_OBTAIN_EXP_AND_GOLD));
    // 文字列の差し替え.
    TextDataManager.SetString(new List<string> { "ラダトーム" });
    Debug.Log(TextDataManager.GetText(TEXT_LABEL.SYSTEM_INFORM_LOCATION));
    // モンスター名の差し替え.(モンスターIDを指定する).
    TextDataManager.SetMonster(new List<int> { 0 });
    Debug.Log(TextDataManager.GetText(TEXT_LABEL.SYSTEM_MONSTER_APPEARS));
応用

今回はタグを利用した文字列の差し替えについて説明しましたが、文字色や文字サイズ・太さの変更なども同じ要領で実装ができると思います。