見出し画像

十二剣戦記の技術的なあれこれ(CSV,JSON読み込み)

ゲームはこちら

魔機やイベントなどのデータはCSVファイルやJSONファイルから読み込んでいる。
基本的にCSVファイルで、真偽値や配列を使うものはJSONファイルになっている。

CSVファイル:状態

飛行,風,P,空を飛んでいる。n近距離攻撃は当たらなくなり、n飛行状態の敵にも攻撃できる。
  • 状態名

  • 属性

  • 有利状態か不利状態か

  • 説明

JSONファイル:イベント

{
  "gimmicks": [
    {
      "key": "大きな氷",
      "enemy": false,
      "detail": "大きな氷がある。氷を解かしたい。",
      "action": [
        "火"
      ],
      "clear": "氷を解かした!",
      "icon": "氷"
    },
  ]
}
  • キー

  • 敵のイベントかどうか

  • 表示されるテキスト

  • 攻略に必要な属性やスキル

  • クリアした時のテキスト

  • アイコン

これらを読み込み、辞書に代入する。

[SerializeField] TextAsset[] csvFiles;
Dictionary<string, State> statesDic = new Dictionary<string, State>();

StringReader reader = new StringReader(csvFiles[2].text);
int c = 0;
while (reader.Peek() != -1)
{
    string[] data = reader.ReadLine().Split(",");
    State state = new State();
    state.name = data[0];
    if (typeColorDic.ContainsKey(data[1]))
    {
        state.color = typeColorDic[data[1]];
    }
    else
    {
        state.color = data[1];
    }
    if (data[2].Equals("N")) state.posi = false;
    state.detail = data[3].Replace("n", "\n");
    state.kind = data[4];
    state.index = c;
    statesDic.Add(state.name, state);
    c++;
}

public class State
{
    public string name, color, detail, kind;
    public bool posi = true;
    public int index = 0;
}

CSVは基本的には,で分割し、クラスの各フィールドに代入しているが、
状態の場合、以下の要素を追加している。

  • 属性から色のカラーコードを取得し、それを状態のカラーコードにする。

  • 有利か不利か判断

  • 説明はnで改行するように(CSVは直接\nで改行されない)

  • アイコンを表すインデックスを追加

[SerializeField] TextAsset[] textAssets;
Dictionary<string, Gimmick> gmmcks_dic = new Dictionary<string, Gimmick>();

string json = textAssets[2].ToString();
GimmickArray ga = JsonUtility.FromJson<GimmickArray>(json);
foreach (Gimmick g in ga.gimmicks)
{
  gmmcks_dic.Add(g.key, g);
}

[System.Serializable]
public class Gimmick
{
    public string key, detail, clear, icon, kind;
    public string[] action;
    public bool enemy;
}
[System.Serializable]
public class GimmickArray
{
    public Gimmick[] gimmicks;
}

JSONはさっきよりは簡単だが、[System.Serializable]を入れる必要がある。

これらの辞書をメソッドから取得できるようにして、別スクリプトで利用する。

public Dictionary<string, Gimmick> GetGmkDic()
{
    return gmmcks_dic;
}

//別スクリプトで
GameManager gm;
[SerializeField] Main main;
gm = main.GetGameManager();
Gimmick g = gm.GetGmkDic()[this.name];

昔はResourcesから読み込んでいたが、今は[SerializeField]を使っている。
Resourcesは非公式推奨な上、容量が大きくなってしまうらしい。

基本的に他のデータも同じだが、敵データだけは特殊なので後日まとめる。

これらデータを読む関数は1番最初に実行したい為、public void Awake(){}の中に書いてある。


CSVやJSONの話だけで一記事分になってしまった😮


この記事が気に入ったらサポートをしてみませんか?