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;
}チャレンジ
中級チームビルダーを使うと、プレイヤーはチームをコードとして共有できます。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;
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。