Yükleme ve Varsayılanlar
Coddy'nin Unity Journey'sinin Unity'de Oyun Mimarisi bölümünün bir parçası. Ders 26 / 50.
Yükleme, bulunmayan veya tamamlanmamış kayıtları da hesaba katmalıdır. Bir yarış oyunu bir RaceSave kaydeder; oyunun 2. sürümü musicVolume özelliğini eklemiştir:
[System.Serializable]
public class RaceSave
{
public int trophies;
public string car = "Rookie Kart";
public float musicVolume = 0.8f;
}RaceSave save;
if (File.Exists(path))
{
save = JsonUtility.FromJson<RaceSave>(File.ReadAllText(path));
}
else
{
save = new RaceSave();
}Yeni bir oyuncunun dosyası yoktur ve eksik bir dosyada File.ReadAllText çağrısı FileNotFoundException hatası verir; bu nedenle önce File.Exists ile kontrol edin ve new RaceSave() ile başlayın: 0 kupa, Rookie Kart ve 0.8 ses düzeyi, yani alan başlatıcıları. Eski bir oyuncunun 1. sürüm dosyasında {"trophies":3,"car":"Red Racer"} bulunur. FromJson yeni bir RaceSave oluşturur; bu işlem alan başlatıcılarını çalıştırır ve ardından yalnızca JSON'da bulunan anahtarları ayarlar; dolayısıyla musicVolume 0.8 olur. Sınıfta alanı olmayan bir anahtar yok sayılır. Bu nedenle oyunun yeni bir sürümü, eklenen her alanın makul bir değerle başlatıcısı olduğu sürece eski kayıtları okuyabilir.
JsonUtility.FromJsonOverwrite(json, obj), yeni bir nesne oluşturmak yerine var olan bir nesneyi doldurur ve JSON'da bulunmayan her alanı olduğu gibi bırakır. FromJson bir MonoBehaviour veya ScriptableObject oluşturamaz (Unity şu hatayı verir: Cannot deserialize JSON to new instances of type 'RaceSettings.'); bu nedenle bir ayar varlığı üzerine yazılarak yüklenir: JsonUtility.FromJsonOverwrite(json, settings);. Üzerine yazma, bir nesnenin zaten sahip olduğu değerleri de korur; örneğin Inspector'ın verdiği değerleri. FromJson ise sınıfın başlatıcılarını geri getirir.
Görev
OrtaSanal evcil hayvan, oyun başladığında pet.json dosyasını yükler; Space tuşu ise evcil hayvanı besler ve kaydeder. Yükleme iki şekilde yanlış çalışıyor:
- Yeni bir oyuncunun
pet.jsondosyası yoktur ve Start, FileNotFoundException hatasıyla durur. Dosya yoksa Inspector'da ayarlanmış evcil hayvanı (Biscuit, hunger 30, happiness 80, bir Ball) koru veA new pet: Biscuitmesajını günlüğe yaz. - Oyunun 1. sürümü yalnızca
petNamevehungerdeğerlerini kaydediyordu;happinessvetoys, 2. sürümde eklendi (PetSave.cs dosyasına bak). FromJson ile yüklenen eski bir kayıt, Inspector'daki değerler yerine sınıfın 50 değerini ve oyuncak olmamasını alır. Mevcut bir dosyayıJsonUtility.FromJsonOverwriteilepetiçine yükle; böylece dosyada bulunmayan değerler Inspector'daki değerlerini korur ve yüklenen adı kullanarakWelcome back, Mochimesajını günlüğe yaz.
Play'e basıp evcil hayvanı besle, ardından Stop'a ve tekrar Play'e bas, sonra Check'e tıkla.
Kendin dene
using System.IO;
using UnityEngine;
using UnityEngine.InputSystem;
using TMPro;
public class PetCare : MonoBehaviour
{
public PetSave pet;
public TMP_Text petText;
private string path;
void Start()
{
path = Path.Combine(Application.persistentDataPath, "pet.json");
pet = JsonUtility.FromJson<PetSave>(File.ReadAllText(path));
Show();
}
void Update()
{
if (Keyboard.current.spaceKey.wasPressedThisFrame)
{
pet.hunger = Mathf.Max(pet.hunger - 10, 0);
pet.happiness = Mathf.Min(pet.happiness + 5, 100);
File.WriteAllText(path, JsonUtility.ToJson(pet));
Show();
}
}
void Show()
{
petText.text = pet.petName + ": hunger " + pet.hunger + ", happiness " + pet.happiness;
}
}
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