初心者必見!現場レベルの「ゲーム制作講座PDF」を無料プレゼント中!▶

Unity JsonUtilityの使い方 | JSONでデータ保存

Unity 基礎操作・設定

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対応)

Unity6対応・スマホ化対応の最新カリキュラム。「何から始めればいいかわからない」という初心者でも、ステップごとに手を動かすだけでRPGが完成します。

講座を見てみる \ゼロからでもスマホ対応RPGが作れる!/

憧れのアクションゲームに挑戦

Unity 2Dアクションゲーム
の作り方講座(ロックマン風)

★★★★★ (スマホ化・広告実装)

初心者でもロックマン風の横スクロールACTが作れる講座。7ステージ+ラスボスという本格構成で、スマホ化・広告実装まで対応。「自分のゲームをリリースしたい」夢を叶えます。

講座を見てみる \初心者でも本格ACTが完成する!/

3Dゲーム開発の入口はここ

ゼルダ風3Dアクションゲーム
の作り方講座

★★★★★ (スマホ化対応)

「3Dゲームって難しそう…」と感じている初心者向けの講座。全16回でゼルダ風3Dアクションがスマホ対応で作れるようになります。3D開発の基礎がしっかり身につきます。

講座を見てみる \初心者でも全16回で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を返すようにしておきましょう。

JSONセーブの実装手順
  • STEP1
    Serializableクラスを定義

    保存したいフィールドをpublicで宣言する
  • STEP2
    ToJsonで文字列化

    ゲーム中のデータをクラスに詰めて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をスマホ向けに作れる!】

Unity ノンフィールドRPGの作り方講座+Slay the Spire風デッキ構築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が作れる!】

Unity 2Dアクションゲームの作り方講座(ロックマン風)

  • ロックマン・マリオ・カービィのような横スクロールACTをゼロから開発
  • 7ステージ+ラスボスステージの本格的なゲーム設計を初心者でも実現
  • スマホ化・AdMob広告実装まで対応してリリースまで見据えた構成
  • 敵AI15体・多彩なマップギミック・武器システムを完全実装
  • 完全オリジナルゲームをアセット不使用で素材提供付きで制作

Unity 2Dアクションゲームの作り方講座(ロックマン風)は、ロックマン・スーパーマリオ・星のカービィのような2D横スクロールアクションゲームを、初心者でもゼロから開発できるようになる講座です。

全16回で当たり判定・物理挙動・敵AIの知識を実際のゲームコードとして実装する体験が詰め込まれています。スマホ化・広告実装まで対応しているため、「作って終わり」ではなくリリースまで見据えた実践スキルが身につきます。

「憧れのアクションゲームを自分の手で作ってみたい」という初心者に強くおすすめの一本です。

スマホ化・広告実装まで対応した本格横スクロールACT
初心者でもロックマン風2Dアクションをリリースまで作り上げよう
→ 2Dアクションゲームの作り方講座を見てみる
初心者でも本格ACTが完成する!広告収益まで視野に入れた実践スキルを手に入れよう!

ゼルダ風3Dアクションゲームの作り方講座【全16回!初心者でも3Dアクションがスマホ対応で作れる!】

ゼルダ風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とつなげて完成度を上げていきましょう。

コメント

タイトルとURLをコピーしました