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;
}Görev
OrtaTakı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.
CharacterBuildiçinde strength ve agility değerlerini kaydedilen değerler hâline getir:Strengthözelliğini bir public alan olanstrengthile değiştir veagilityalanını private tutup[SerializeField]ile işaretle.- Tek başına bir liste
{}şeklinde yazılır. CharacterBuild'in altına, bir public alanı olanheroes(birList<CharacterBuild>) ile[System.Serializable]birTeamsınıfı yaz.TeamCodeiçindeheroeslistesini Team türünde bir public alan olanteamile değiştir veTeam code:ifadesinin ardındanteamdeğerinin JSON'unu kaydet. LoadCodeiçinde JsonUtility ile koduteamiçine oku ve içerdiği kahraman sayısınıLoaded 3 heroesbiç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;
}
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
1Hiyerarşiler Değil, Bileşenler
Küçük BileşenlerTemel Bir Düşman BetiğiSoyut BileşenlerBirlikte Çalışan BileşenlerÖzet: Modüler Taret4Serileştirilmiş Veriler
Serileştirilebilir SınıflarInspector'da ListelerInspector'da Enum'larÖzet: Ganimet Tablosu7Durum Makineleri
Sınıflar Olarak DurumlarBir Durum MakinesiGeçişlerDüşmanların Yapay ZekâsıTekrar: Kapı Durumları10Proje: Arena Hayatta Kalma
KahramanDüşman Türleri5ScriptableObjects
Veri VarlıklarıSilah İstatistikleriPaylaşılan AyarlarVeri Olarak DalgalarTekrar: Eşya Veritabanı8Yeniden Kullanılabilir Kod
Genişletme MetotlarıGeneric SingletonGeneric YardımcılarTekrar: FindNearest