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 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.

challenge icon

Görev

Orta

Yeni oyuncular ve eski kayıtlar için pet.json dosyasını güvenli bir şekilde yükle.

  1. Start() içinde, FromJson satırını if (File.Exists(path)) ve bir else ile değiştir.
  2. Dosya varsa Inspector'daki pet verisini doldur: JsonUtility.FromJsonOverwrite(File.ReadAllText(path), pet);, ardından pet.petName değerini kullanarak Welcome back, Mochi mesajını günlüğe yaz.
  3. Dosya yoksa aynı şekilde A new pet: Biscuit mesajı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

Kendi başına pratik yap: Unity playground