💨

武器やステータスもまとめて保存!Unityで自作クラスをJSON化→PlayerPrefsへ【初心者OK】

2025/01/06に公開

はじめに

「キャラクターの名前やレベル、装備品など、バラバラな情報をひとまとめに管理したい!」——Unityでゲーム開発をしていると、そんな場面に出くわすことはありませんか?
とはいえ、PlayerPrefs文字列しか扱えないため、そのままだと複雑なデータ構造は保存しづらいですよね。そこで活躍するのがJSON形式

本記事では、“自作クラスをJSON形式に変換してPlayerPrefsへ保存・読み込みする”手順を、初心者向けにわかりやすく解説します。武器やステータスをまるごとまとめてセーブするイメージで読んでみてください。

Unityの基本操作からC#スクリプトの基礎まで、やさしく学べる入門チュートリアルはこちら
https://zenn.dev/ryuryu_game/books/fd28de9d8e963a/viewer/0570af

1. JSON形式とは?

JSON(JavaScript Object Notation) は、複数の数値や文字列などをオブジェクトとしてまとめ、テキスト形式でやり取りできる軽量なデータ交換フォーマットです。

  • ゲーム開発やWeb開発など、幅広い分野で利用されており、「人にも機械にも読みやすい」のが大きな特徴です。
  • Unityには、このJSON形式を簡単に扱えるJsonUtilityクラスが標準搭載されているため、複雑なクラスやリストでもシンプルにセーブ&ロードできます。

2. UnityでJSONを扱う準備

Unityでは、JsonUtilityを使うだけでオブジェクトをJSON文字列に変換したり、逆にJSON文字列をもとにオブジェクトを復元したりできます。

  1. [System.Serializable] 属性
    自作クラスをJSON化するには、クラスに[System.Serializable]を付与し、シリアライズ可能にする必要があります。

  2. JsonUtility.ToJson
    オブジェクトをJSON文字列へ変換するメソッド。

    string json = JsonUtility.ToJson(data);
    
  3. JsonUtility.FromJson
    JSON文字列を元にオブジェクトを復元するメソッド。

    PlayerData data = JsonUtility.FromJson<PlayerData>(json);
    

3. 自作クラスをJSON形式に変換して保存する流れ

ここでは、キャラクターの名前・スコア・レベルなどをまとめた「自作クラス」をJSON形式で保存し、PlayerPrefsから読み込むサンプルを見ていきましょう。

スクリプト例

using UnityEngine;

[System.Serializable] // クラスをシリアライズ可能にする
public class PlayerData
{
    public string playerName;
    public int score;
    public int level;

    public PlayerData(string name, int score, int level)
    {
        this.playerName = name;
        this.score = score;
        this.level = level;
    }
}

public class PlayerPrefsJsonExample : MonoBehaviour
{
    private const string PlayerDataKey = "PlayerData";

    void Start()
    {
        // データの保存
        PlayerData player = new PlayerData("UnityMaster", 100, 5);
        SavePlayerData(player);

        // データの読み込み
        PlayerData loadedPlayer = LoadPlayerData();
        Debug.Log($"Player Name: {loadedPlayer.playerName}, Score: {loadedPlayer.score}, Level: {loadedPlayer.level}");
    }

    // クラスをJSON形式の文字列に変換し、PlayerPrefsに保存する
    void SavePlayerData(PlayerData data)
    {
        string json = JsonUtility.ToJson(data);
        PlayerPrefs.SetString(PlayerDataKey, json);
        PlayerPrefs.Save();
        Debug.Log($"データが保存されました: {json}");
    }

    // PlayerPrefsから読み込み、JSON形式の文字列をクラスに変換する
    PlayerData LoadPlayerData()
    {
        string json = PlayerPrefs.GetString(PlayerDataKey, "{}"); // デフォルト値として空のJSON
        return JsonUtility.FromJson<PlayerData>(json);
    }
}
  • SavePlayerDataでは、自作クラス(PlayerData)をJsonUtility.ToJsonで文字列化し、PlayerPrefs.SetStringで保存しています。
  • LoadPlayerDataでは、文字列をPlayerPrefs.GetStringで取得し、JsonUtility.FromJsonを使ってPlayerDataに戻します。

4. 詳細解説

  1. [System.Serializable] 属性
    これを付けないと、JsonUtility.ToJsonでクラスを変換できません。自作クラスには必ず付けましょう。

  2. JsonUtility.ToJson / FromJson

    • ToJson: Object → JSON文字列
    • FromJson: JSON文字列 → Object
      この2つが基本的な変換の流れになります。
  3. PlayerPrefsにJSONを保存

    • PlayerPrefs.SetString("キー名", 文字列)で保存し、PlayerPrefs.Save()を呼び出します。
    • 文字列として保存できるので、クラスのどんなパラメータでもまとめてセーブできるのがポイントです。

5. 応用例:複数プレイヤーデータを保存

もし複数のキャラクターや装備データを一気に管理したい場合、リストや配列をまとめたクラスを作り、それをJSON化すればOKです。

スクリプト例

using UnityEngine;
using System.Collections.Generic;

[System.Serializable]
public class PlayerDataList
{
    public List<PlayerData> players;

    public PlayerDataList()
    {
        players = new List<PlayerData>();
    }
}
public class PlayerPrefsJsonListExample : MonoBehaviour
{
    private const string PlayerDataListKey = "PlayerDataList";

    void Start()
    {
        // サンプルデータ作成
        PlayerDataList playerList = new PlayerDataList();
        playerList.players.Add(new PlayerData("Player1", 100, 5));
        playerList.players.Add(new PlayerData("Player2", 200, 10));

        // 保存
        SavePlayerDataList(playerList);

        // 読み込み
        PlayerDataList loadedPlayerList = LoadPlayerDataList();
        foreach (var player in loadedPlayerList.players)
        {
            Debug.Log($"Player Name: {player.playerName}, Score: {player.score}, Level: {player.level}");
        }
    }

    void SavePlayerDataList(PlayerDataList dataList)
    {
        string json = JsonUtility.ToJson(dataList);
        PlayerPrefs.SetString(PlayerDataListKey, json);
        PlayerPrefs.Save();
        Debug.Log($"データが保存されました: {json}");
    }

    PlayerDataList LoadPlayerDataList()
    {
        string json = PlayerPrefs.GetString(PlayerDataListKey, "{}");
        return JsonUtility.FromJson<PlayerDataList>(json);
    }
}
  • リスト内の複数キャラクター、武器などをまとめてJSON文字列にし、PlayerPrefsに保存する流れです。
  • たとえばRPGで複数パーティーメンバーのステータスを管理するなど、柔軟に応用できます。

6. まとめ

  • JSON形式を使うと、複雑なデータ構造(キャラクター情報や装備リストなど)もPlayerPrefsに一括で保存可能。
  • UnityのJsonUtilityを活用すれば、自作クラスをラクにシリアライズし、細かい数値や文字列をひとまとまりに扱える。
  • リストや配列にも応用できるので、複数キャラやアイテムのセーブ処理にも便利。

PlayerPrefs×JSONの組み合わせを使うと、武器やステータスなど色々なデータをまとめて管理でき、ゲーム開発の生産性がグッと高まります。ぜひ、あなたのプロジェクトにも取り入れてみてください!

この記事を読んでもっと実践したいと感じたあなたへ

Unity開発を効率よく進めるためには、実践的なスキルと仲間との交流が欠かせません。
そんな方におすすめのステップが、下記の3つです。

1. 有料教材「どこでもUnity教室」でゲーム制作を短期マスター

  • 5日でシンプルなFPS完成:初心者向けに要点を押さえたカリキュラム
  • C#や最新のInputSystem、FPS実装まで網羅:つまずきやすいポイントを先回りで解説
  • 購入特典:Discord招待+サンプルプロジェクトDLで、疑問や実装例を即確認

Unity初心者でも最短5日で3D FPSが完成!今すぐ始める入門チュートリアルはこちら

https://zenn.dev/ryuryu_game/books/fd28de9d8e963a/viewer/0570af

2. 無料コミュニティで、疑問をすぐに解消&モチベーションUP

  • 初心者~中級者までOK:学習進度に合わせて質問や情報共有
  • 質問サポートが充実:わからないことを仲間や講師に即相談
  • 学習仲間と切磋琢磨:一緒に学ぶから続けやすい

Discordサーバー参加はこちら

https://discord.gg/5FwuKCacNy

3. 実績豊富な“ゲーム開発所RYURYU”があなたをトータルサポート

  • コナラ総販売200件超:さまざまなUnity開発の依頼を対応
  • VR/AR/AIなど最新技術にも精通:幅広いノウハウを活かして開発支援
  • ゲームクリエイター甲子園や東京ゲームショウなど出展実績多数

ご相談・お問い合わせはこちら

https://coconala.com/users/1772507

Discussion