Menu
CoddyTech

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.

challenge icon

Görev

Orta

Sanal 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.json dosyası yoktur ve Start, FileNotFoundException hatasıyla durur. Dosya yoksa Inspector'da ayarlanmış evcil hayvanı (Biscuit, hunger 30, happiness 80, bir Ball) koru ve A new pet: Biscuit mesajını günlüğe yaz.
  • Oyunun 1. sürümü yalnızca petName ve hunger değerlerini kaydediyordu; happiness ve toys, 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.FromJsonOverwrite ile pet içine yükle; böylece dosyada bulunmayan değerler Inspector'daki değerlerini korur ve yüklenen adı kullanarak Welcome back, Mochi mesajı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;
    }
}
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