Menu
CoddyTech

JsonUtility

Coddy'nin Unity Journey'sinin Unity'de Oyun Mimarisi bölümünün bir parçası. Ders 24 / 50.

JSON, bir nesnenin değerlerini tutan metindir; bu nedenle günlüğe kaydedilebilir, gönderilebilir veya bir dosyaya yazılabilir. JsonUtility.ToJson(obj) bir nesneyi JSON'a dönüştürür ve JsonUtility.FromJson<T>(json) ondan yeni bir T oluşturur. JsonUtility, Inspector'ın izlediği kuralları izler; bu nedenle [System.Serializable] bir sınıfta çalışır:

[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 ve Rank eksiktir. JsonUtility, herkese açık alanları ve [SerializeField] ile işaretlenmiş özel alanları yazar; başka hiçbir şeyi yazmaz: özellikleri, statik alanları veya sıradan özel alanları yazmaz. Bir Dictionary alanı da atlanır; sınıfı [System.Serializable] olmayan bir alan da öyle. Inspector da bu alanları dışarıda bırakır. JsonUtility.ToJson(obj, true) aynı JSON'u birkaç satıra yayarak yazar; böylece okunması kolaylaşır.

Bir sınıfın içindeki liste, badges gibi yazılır. Tek başına bir liste yazılmaz: JsonUtility en üst düzeyde bir nesneye ihtiyaç duyar; bu nedenle 10, 20 ve 30 değerlerinden oluşan bir List<int> için JsonUtility.ToJson(scores) çağrısı {} döndürür. Listeyi bir sınıfa koyup bunu dönüştürün; aynı listeyi içeren bir ScoreBoard şu şekilde yazılır: {"scores":[10,20,30]}:

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

Görev

Orta

Takım oluşturucu, oyuncuların bir takımı kod olarak paylaşmasını sağlar. Space, takımı JSON olarak kaydetmeli ve LoadCode(string code) bir kodu okuyabilmelidir. Şu anda Space Team code: {} kaydediyor ve kahramanların strength ve agility değerleri Inspector'da bile görünmüyor.

  • CharacterBuild içinde strength ve agility değerlerini kaydedilen değerler hâline getir: Strength özelliğini bir public alan olan strength ile değiştir ve agility alanını private tutup [SerializeField] ile işaretle.
  • Tek başına bir liste {} şeklinde yazılır. CharacterBuild'in altına, bir public alanı olan heroes (bir List<CharacterBuild>) ile [System.Serializable] bir Team sınıfı yaz. TeamCode içinde heroes listesini Team türünde bir public alan olan team ile değiştir ve Team code: ifadesinin ardından team değerinin JSON'unu kaydet.
  • LoadCode içinde JsonUtility ile kodu team içine oku ve içerdiği kahraman sayısını Loaded 3 heroes biçiminde kaydet.

Inspector, team alanını bir Şövalye (strength 8, agility 3) ve bir Okçu (strength 4, agility 9) ile doldurur. Play'e basıp Space'e bas, Console'da kodu oku, ardından Check'e bas.

Kendin dene

using UnityEngine;

[System.Serializable]
public class CharacterBuild
{
    public string hero;
    public int Strength { get; set; }
    private int agility;
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Unity'de Oyun Mimarisi bölümündeki tüm dersler