![見出し画像](https://assets.st-note.com/production/uploads/images/148530899/rectangle_large_type_2_13d748f3493fcf5c42b1b9e17aca64d2.png?width=1200)
Photo by
ryonakano
十二剣戦記の技術的なあれこれ(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の話だけで一記事分になってしまった😮
この記事が気に入ったらサポートをしてみませんか?