表示テーマ
CSV・JSONとデータ保存
ゲームの表データにはCSV、設定やセーブにはJSONを使えます。Projectへ入れたTextAssetの読込と、ユーザーPCへ書き出すセーブデータは分けて考えます。
TextAssetを読む
C#の保存FieldへTextAssetを設定します。textで文字列、bytesでbyte列、dataSizeでサイズを取得できます。内容を外部から更新した場合は、必要な時点でReloadを呼びます。
csharp
[SerializeField] private TextAsset? table;
void Start() {
// 設定したTextAssetをヘッダー付きCSVとして読み取る
if (table == null) return;
var csv = CsvUtility.Parse(table.text, hasHeader: true);
Debug.Log(csv.rows.Count);
}CSV
CsvUtilityは引用符付きのセル、区切り文字や改行を含む値を扱います。文字列を単純に,でSplitすると、引用符のあるデータを壊す場合があります。
先頭行を見出しとして扱う場合はhasHeader: trueにします。数値はTryGetInt32などで変換結果を確認し、未設定のセルや行数の不足も扱ってください。
JSON
JsonUtilityは保存対象のFieldをJSONへ変換します。通常のC#プロパティが、すべて自動で保存Fieldと同じ扱いになるとは限りません。
cs
using NEMEngine;
using System.IO;
public sealed class PlayerSaveData {
public int score;
public Vector3 position;
}
public sealed class SaveDataExample : MonoBehaviour {
void Update() {
// 保存・読込の失敗をGame Consoleへ通知
try {
if (Input.GetKeyDown(KeyCode.F5)) Save();
if (Input.GetKeyDown(KeyCode.F9)) Load();
} catch (Exception error) {
Debug.LogWarning($"セーブデータを処理できません: {error.Message}");
}
}
void Save() {
// 保存したい値をゲーム用のデータへまとめる
var data = new PlayerSaveData { score = 100, position = transform.position };
// ユーザーの保存先へJSONを書き出す
Directory.CreateDirectory(Application.persistentDataPath);
string path = Path.Combine(Application.persistentDataPath, "save.json");
File.WriteAllText(path, JsonUtility.ToJson(data));
}
void Load() {
// 保存ファイルがある場合だけ復元
string path = Path.Combine(Application.persistentDataPath, "save.json");
if (!File.Exists(path)) return;
var data = JsonUtility.FromJson<PlayerSaveData>(File.ReadAllText(path));
transform.position = data.position;
}
}このScriptをGameObjectへ追加し、Play中にF5で保存、F9で読み込みます。保存後にGameObjectを移動してから読み込むと、保存時の位置へ戻ります。
FromJsonOverwriteは既存のデータへ指定項目を反映する操作です。保存形式を変える場合は、過去のファイルが足りない項目を持つ場合と、不正な型を持つ場合の両方を考慮します。
保存先
ユーザーデータはApplication.persistentDataPathの下へ保存します。GameAssetsやEngine既定ファイルへセーブデータを書かないでください。フォルダー作成、権限、容量不足、壊れたJSONの例外を処理します。
この例はファイルI/Oのため、フレームごとに実行しません。大きなデータや頻繁な保存では、ゲームの更新を止めない実行方法と保存の完了を設計してください。