Menu
CoddyTech

JsonUtility

CoddyのUnityジャーニー「Unityにおけるゲームアーキテクチャ」セクションの一部。レッスン 24/50。

JSONはオブジェクトの値を保持するテキストなので、ログに記録したり、送信したり、ファイルに書き込んだりできます。JsonUtility.ToJson(obj)はオブジェクトをJSONに変換し、JsonUtility.FromJson<T>(json)はそこから新しいTを作成します。JsonUtilityはInspectorと同じルールに従うため、[System.Serializable]クラスで機能します。

[System.Serializable]
public class PlayerProfile
{
    public string playerName = "Ana";
    public int level = 7;
    public List<string> badges = new List<string> { "Explorer", "Sharpshooter" };
    [SerializeField] private float hoursPlayed = 12.5f;
    private int secretCode = 1234;
    public int Rank { get; set; } = 3;
}
string json = JsonUtility.ToJson(new PlayerProfile());
// {"playerName":"Ana","level":7,"badges":["Explorer","Sharpshooter"],"hoursPlayed":12.5}
PlayerProfile copy = JsonUtility.FromJson<PlayerProfile>(json);

secretCodeとRankは含まれません。JsonUtilityが書き込むのは、publicフィールドと[SerializeField]が付いたprivateフィールドだけで、それ以外は書き込みません。プロパティやstaticフィールド、通常のprivateフィールドは含まれません。Dictionaryフィールドもスキップされ、クラスが[System.Serializable]でないフィールドも同様です。これらはInspectorでも除外されます。JsonUtility.ToJson(obj, true)を使うと、同じJSONが複数行に分けて書き込まれ、読みやすくなります。

クラス内のリストは、badgesのように書き込まれます。一方、単独のリストは書き込まれません。JsonUtilityは最上位にオブジェクトを必要とするため、10、20、30を含むList<int>に対するJsonUtility.ToJson(scores)は{}を返します。リストをクラスに入れて変換してください。同じリストを保持するScoreBoardは{"scores":[10,20,30]}として書き込まれます。

[System.Serializable]
public class ScoreBoard
{
    public List<int> scores;
}
challenge icon

チャレンジ

中級

チームビルダーを使うと、プレイヤーはチームをコードとして共有できます。Spaceを押すとチームがJSONとしてログに出力され、LoadCode(string code)でコードを読み込めるようにします。現在、Spaceを押すとTeam code: {}とログに出力され、ヒーローのstrengthとagilityはInspectorにも表示されていません。

  • CharacterBuildで、strengthとagilityを保存される値にします。Strengthプロパティをパブリックフィールドstrengthに置き換え、agilityはプライベートのまま[SerializeField]を付けます。
  • リストだけの場合は{}として書き出されます。CharacterBuildの下に、[System.Serializable]クラスTeamを記述し、List<CharacterBuild>型のパブリックフィールドheroesを1つ持たせます。TeamCodeでは、heroesリストをTeam型のパブリックフィールドteamに置き換え、Team code: の後にteamのJSONをログに出力します。
  • LoadCodeでは、JsonUtilityを使ってコードをteamに読み込み、保持しているヒーローの数をLoaded 3 heroesのようにログに出力します。

InspectorでteamにKnight(strength 8、agility 3)とArcher(strength 4、agility 9)を設定します。Playを押してからSpaceを押し、Consoleでコードを確認して、Checkを押します。

自分で試してみよう

using UnityEngine;

[System.Serializable]
public class CharacterBuild
{
    public string hero;
    public int Strength { get; set; }
    private int agility;
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

Unityにおけるゲームアーキテクチャのすべてのレッスン