Yükleme ve Varsayılanlar
Coddy'nin Unity Journey'sinin Unity'de Oyun Mimarisi bölümünün bir parçası. Ders 32 / 64.
Yükleme işlemi, mevcut olmayan veya tamamlanmamış kayıtlarla başa çıkmalıdır. Bir yarış oyunu RaceSave kaydeder; oyunun 2. sürümünde musicVolume eklendi:
[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 et ve new RaceSave() ile başla: 0 kupa, Rookie Kart ve 0.8 ses düzeyi; bunlar alan başlatıcılarının değerleridir. 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, bu yüzden musicVolume değeri 0.8 olur. Sınıfta alanı bulunmayan bir anahtar yok sayılır. Bu nedenle, her yeni alanın mantıklı bir değere sahip başlatıcısı olduğu sürece oyunun yeni bir sürümü eski kayıtları okuyabilir.
JsonUtility.FromJsonOverwrite(json, obj), yeni bir nesne oluşturmak yerine zaten var olan bir nesneyi doldurur ve JSON'da bulunmayan tüm alanları olduğu gibi bırakır. FromJson, MonoBehaviour veya ScriptableObject oluşturamaz (Unity Cannot deserialize JSON to new instances of type 'RaceSettings.' hatasını verir); bu nedenle bir ayar varlığı, üzerine yazarak yüklenir: JsonUtility.FromJsonOverwrite(json, settings);. Üzerine yazma işlemi, FromJson sınıfın başlatıcı değerlerini geri getirirken, nesnenin zaten sahip olduğu değerleri (örneğin Inspector'ın verdiği değerleri) de korur.
Görev
OrtaYeni oyuncular ve eski kayıtlar için pet.json dosyasını güvenli bir şekilde yükle.
Start()içinde, FromJson satırınıif (File.Exists(path))ve birelseile değiştir.- Dosya varsa Inspector'daki pet verisini doldur:
JsonUtility.FromJsonOverwrite(File.ReadAllText(path), pet);, ardındanpet.petNamedeğerini kullanarakWelcome back, Mochimesajını günlüğe yaz. - Dosya yoksa aynı şekilde
A new pet: Biscuitmesajını günlüğe yaz.
“Oyna” düğmesine bas, evcil hayvanı besle, ardından Durdur ve tekrar “Oyna”: evcil hayvan seni tekrar karşıladığını söyler. Sonra “Kontrol et” düğmesine bas.
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;
}
}
Unity'de Oyun Mimarisi bölümündeki tüm dersler
1Kalıtım Değil, Bileşenler
Küçük BileşenlerTemel Düşman Script'iSoyut BileşenlerBirlikte Çalışan BileşenlerTekrar: Modüler TaretTekrar: Çift Namlulu Top4Serileştirilmiş Veriler
Serileştirilebilir SınıflarInspector'da ListelerInspector'da Enum'larTekrar: Ganimet TablosuTekrar: Ganimeti At2Unity'de Arayüzler
IDamageableArayüzler ve TryGetComponentGetComponentsÖzet: Etkileşim TuşuÖzet: Erişim Mesafesindeki En Yakın5ScriptableObjects
Veri VarlıklarıSilah İstatistikleriOrtak AyarlarRüzgârı KaydetVeri Olarak DalgalarTekrar: Eşya VeritabanıTekrar: Dükkândan Satın Al8Yeniden Kullanılabilir Kod
Genişletme MetotlarıGeneric SingletonGeneric YardımcılarTekrar: FindNearestKendi başına pratik yap: Unity playground