PlayerPrefsでは、スコア1つや音量設定くらいなら十分です。
一方で、プレイヤー名・レベル・所持アイテムの一覧までまとめて残したいときは、データの形を決めて保存する必要があります。
そのとき役立つのが、Unity標準のJsonUtilityです。
この記事では、[Serializable]属性付きクラスを定義し、ToJsonで文字列化、FromJsonで復元する流れを解説します。
ファイル保存との組み合わせや、配列を扱うときのWrapperクラスも触れます。
- クラスを定義したのにシリアライズされず、空のJSONになる
- Listをそのまま保存しようとしてエラーになる
- PlayerPrefsとの組み合わせ方がわからない
✨ この記事でわかること
- [Serializable]クラスとJsonUtilityの基本
- ToJson / FromJsonの使い方
- プレイヤーデータのセーブ・ロード実装例
- File.WriteAllTextでのファイル保存
- PlayerPrefsの文字列保存との連携
- 配列・Listの制限とWrapperクラスでの回避
\プログラミング未経験でも大丈夫!まずは1本作り切ろう/
初心者が最初に選ぶならコレ
Unity ノンフィールドRPG
+スレスパ風JRPG講座
Unity6対応・スマホ化対応の最新カリキュラム。「何から始めればいいかわからない」という初心者でも、ステップごとに手を動かすだけでRPGが完成します。
憧れのアクションゲームに挑戦
Unity 2Dアクションゲーム
の作り方講座(ロックマン風)
初心者でもロックマン風の横スクロールACTが作れる講座。7ステージ+ラスボスという本格構成で、スマホ化・広告実装まで対応。「自分のゲームをリリースしたい」夢を叶えます。
3Dゲーム開発の入口はここ
ゼルダ風3Dアクションゲーム
の作り方講座
「3Dゲームって難しそう…」と感じている初心者向けの講座。全16回でゼルダ風3Dアクションがスマホ対応で作れるようになります。3D開発の基礎がしっかり身につきます。
JsonUtilityとは何か
JsonUtilityは、Unityに組み込まれているJSONシリアライズ用APIです。
C#のオブジェクトをJSON文字列に変換し、ファイルやPlayerPrefsに書き込めます。
外部ライブラリなしで、個人開発のセーブデータ作成に使えます。
ただし、任意のクラスがそのまま使えるわけではありません。
[System.Serializable]属性を付けたクラス、かつpublicフィールド(または[SerializeField])が対象です。
制約を理解したうえで設計しましょう。
セーブ用クラスを定義する
まず、保存したいデータの入れ物となるクラスを作ります。
[System.Serializable]
public class PlayerSaveData
{
public string playerName;
public int level;
public int gold;
public bool tutorialDone;
}
プロパティ(get/setのみ)はシリアライズ対象外です。
フィールドとして宣言するか、[SerializeField]を付けてください。
辞書(Dictionary)も直接は扱えないため、必要なら別のリスト形式に落とし込みます。
ToJsonとFromJsonの基本
オブジェクト→JSONはJsonUtility.ToJson、JSON→オブジェクトはJsonUtility.FromJsonです。
// 保存 PlayerSaveData data = new PlayerSaveData; data.playerName = "Hero"; data.level = 5; data.gold = 320; string json = JsonUtility.ToJson(data, true); // trueで整形出力 // 読み込み PlayerSaveData loaded = JsonUtility.FromJson<PlayerSaveData>(json); Debug.Log(loaded.playerName); // Hero
ToJsonの第2引数をtrueにすると、人間が読みやすい改行付きJSONになります。
デバッグ中はtrue、本番のファイル保存はfalseで容量を抑える、という使い分けもできます。

FromJsonは、JSONのキー名とフィールド名が一致している必要があります。
綴りを変えたら復元に失敗するので、クラス設計はシンプルに保ちましょう。
ファイルに保存する最小実装
JSON文字列をApplication.persistentDataPath配下のファイルに書き込む例です。
OSごとに安全な保存場所が自動で決まります。
using System.IO;
public class SaveManager : MonoBehaviour
{
private string savePath;
void Awake
{
savePath = Path.Combine(Application.persistentDataPath, "save.json");
}
public void SaveGame(PlayerSaveData data)
{
string json = JsonUtility.ToJson(data);
File.WriteAllText(savePath, json);
}
public PlayerSaveData LoadGame
{
if (!File.Exists(savePath))
return new PlayerSaveData;
string json = File.ReadAllText(savePath);
return JsonUtility.FromJson<PlayerSaveData>(json);
}
}
ゲーム開始時にLoadGame、チェックポイントや終了時にSaveGameを呼ぶ構成が基本です。
ファイルが無い初回は、新しいPlayerSaveDataを返すようにしておきましょう。
- STEP1Serializableクラスを定義
保存したいフィールドをpublicで宣言する
- STEP2ToJsonで文字列化
ゲーム中のデータをクラスに詰めてToJsonを呼ぶ
- STEP3ファイルに書き込み
persistentDataPathにWriteAllTextで保存する
- STEP4起動時にFromJsonで復元
ReadAllTextしてFromJson、各システムへデータを渡す
PlayerPrefsとの組み合わせ
データ量が小さければ、JSON文字列をPlayerPrefs.SetStringに入れる方法もあります。
string json = JsonUtility.ToJson(data);
PlayerPrefs.SetString("PlayerSave", json);
PlayerPrefs.Save;
// 読み込み
string loadedJson = PlayerPrefs.GetString("PlayerSave", "");
if (!string.IsNullOrEmpty(loadedJson))
{
data = JsonUtility.FromJson<PlayerSaveData>(loadedJson);
}
PlayerPrefsにはサイズ上限があるため、大きなセーブデータはファイル保存の方が無難です。
設定+軽い進行データ程度なら、SetStringでも十分なことが多いです。
配列とListの制限・Wrapperで回避
JsonUtilityは、トップレベルの配列やListを直接シリアライズできません。
アイテム一覧を保存したいときは、配列を包むWrapperクラスを用意します。
[System.Serializable]
public class ItemData
{
public int id;
public int count;
}
[System.Serializable]
public class ItemListWrapper
{
public ItemData[] items;
}
// 保存
ItemListWrapper wrapper = new ItemListWrapper;
wrapper.items = itemArray;
string json = JsonUtility.ToJson(wrapper);
// 読み込み
ItemListWrapper loaded = JsonUtility.FromJson<ItemListWrapper>(json);
| データ型 | JsonUtilityでの扱い |
|---|---|
| publicフィールドのクラス | [Serializable]を付ければToJson/FromJson可能 |
| クラス内の配列 | 親クラス経由ならシリアライズできる |
| トップレベルのList | 直接不可。 Wrapperか配列に変換が必要 |
| Dictionary | 非対応。 キーと値のリストに分解するなど別設計が必要 |
よくあるエラーと対処
FromJsonの結果がnullになるときは、JSON文字列が空か、クラス定義とキー名が一致していない可能性があります。
Debug.Log(json)で保存内容を確認し、フィールド名の綴りを見直してください。
「Serialization depth limit」系の警告は、クラス同士が循環参照しているときに出ます。
親子関係を一方向に整理するか、参照ではなくIDだけを保存する設計に変えましょう。
日本語を含むプレイヤー名を保存するときは、ファイルのエンコーディングに注意が必要です。
WriteAllTextはUTF-8がデフォルトですが、環境によってはBOM付きになるため、読み込み側も同じ設定に揃えてください。
本格運用時の選択肢
JsonUtilityは軽量で学習コストが低い反面、柔軟性に限界があります。
ネストが深いJSON、スキーマの厳密な検証、大規模なデータ移行が必要なら、Newtonsoft Json.NETなどのサードパーティライブラリも検討対象です。
個人の学習作品や小規模リリースなら、まずJsonUtilityで「名前・レベル・アイテム数件」を保存できる状態を作るのが現実的です。
必要になったタイミングでライブラリを足せば大丈夫です。

セーブデータのバージョン番号をクラスに1つ入れておくと、あとからフィールドを増やしたときの互換性管理が楽になりますよ。
記事を読んで「作ってみたい!」と思ったら!初心者でも1本完成できる講座で実力をつけよう
知識を読むだけで終わらせるのはもったいない。実際に手を動かしてゲームを1本完成させることで、理解が一気に深まります。プログラミング未経験からでも取り組める講座で、ゲーム開発の第一歩を踏み出しましょう。
Unity ノンフィールドRPG+スレスパ風JRPG講座【Unity6対応!初心者でもデッキ構築×JRPGをスマホ向けに作れる!】

- Unity6対応・スマホ化対応で最新環境のゲーム開発が学べる
- Slay the Spire風のデッキ構築システム×JRPGの組み合わせを実装
- 初心者でも迷わず進められる丁寧な解説構成
- ノンフィールドRPGとデッキ構築JRPGの2つをまとめて学べるセット講座
Unity ノンフィールドRPGの作り方講座+Slay the Spire風デッキ構築JRPGの作り方講座は、プログラミング未経験の初心者でも取り組みやすい、ステップバイステップ形式の講座です。
Unity6対応・スマホ化対応の最新カリキュラムで、読んで「なるほど」と思った知識を、実際に動くゲームとして形にする体験ができます。
「何から始めればいいかわからない…」という初心者が最初に選ぶ一本として最適な講座です。
Unity6対応・スマホ化対応の最新カリキュラム
ゼロからでもRPGを完成させよう
→ スレスパ風デッキ構築JRPG講座を見てみる
初心者でもスマホ対応のRPGが作れる!まずは1本完成を目指そう!
Unity 2Dアクションゲームの作り方講座(ロックマン風)【全16回!初心者でもスマホ化・広告実装まで対応した本格横スクロールACTが作れる!】

- ロックマン・マリオ・カービィのような横スクロールACTをゼロから開発
- 7ステージ+ラスボスステージの本格的なゲーム設計を初心者でも実現
- スマホ化・AdMob広告実装まで対応してリリースまで見据えた構成
- 敵AI15体・多彩なマップギミック・武器システムを完全実装
- 完全オリジナルゲームをアセット不使用で素材提供付きで制作
Unity 2Dアクションゲームの作り方講座(ロックマン風)は、ロックマン・スーパーマリオ・星のカービィのような2D横スクロールアクションゲームを、初心者でもゼロから開発できるようになる講座です。
全16回で当たり判定・物理挙動・敵AIの知識を実際のゲームコードとして実装する体験が詰め込まれています。スマホ化・広告実装まで対応しているため、「作って終わり」ではなくリリースまで見据えた実践スキルが身につきます。
「憧れのアクションゲームを自分の手で作ってみたい」という初心者に強くおすすめの一本です。
スマホ化・広告実装まで対応した本格横スクロールACT
初心者でもロックマン風2Dアクションをリリースまで作り上げよう
→ 2Dアクションゲームの作り方講座を見てみる
初心者でも本格ACTが完成する!広告収益まで視野に入れた実践スキルを手に入れよう!
ゼルダ風3Dアクションゲームの作り方講座【全16回!初心者でも3Dアクションがスマホ対応で作れる!】

- ゼルダの伝説・モンハン・原神のような3Dアクションをゼロから開発
- 「3Dは難しそう」と感じている初心者でも取り組みやすい丁寧な解説構成
- スマホ化対応で実機で動かせるゲームが完成
- アセットを使った実践的なゲーム開発手法が身につく
- 画像・動画・全ソースコード公開の充実したサポート
ゼルダ風3Dアクションゲームの作り方講座は、「3Dゲームは難しそう…」と感じている初心者こそおすすめの入門講座です。
全16回の丁寧な解説で、ゼルダの伝説・モンハン・原神のような本格的な3Dアクションゲームを確実に完成まで導きます。スマホ化対応で実機で動かせるため、初めて3Dゲームを作り上げた達成感がひときわ大きい講座です。
「3Dゲームを自分でも作れるか試してみたい」という初心者の最初の一歩として最適です。
初心者でも3Dアクションがスマホ対応で完成する
ゼルダ風3Dアクションゲームで3D開発の壁を一気に突破しよう
→ ゼルダ風3Dアクションゲームの作り方講座を見てみる
全16回でスマホで動くオリジナル3Dゲームを完成させよう!
まとめ
JsonUtilityは、[Serializable]クラスをToJsonで文字列化し、FromJsonで復元するUnity標準のJSON保存手段です。
ファイル保存と組み合わせれば、プレイヤーの進行データを構造化して残せます。
配列はWrapperクラスで包み、Dictionaryは別設計が必要——この2点を押さえれば、多くのインディーゲームのセーブ要件に対応できます。
まずは小さなSaveDataクラスから試してみてください。
ゲーム全体のデータ設計を学びたい方は、Unity入門の森の講座も参考になります。
セーブ機能を動かしたら、次はシーン遷移やUIとつなげて完成度を上げていきましょう。



コメント