Menu
CoddyTech

Muat dan Nilai Default

Termasuk bagian Arsitektur Game di Unity dalam perjalanan Unity di Coddy. Pelajaran 26 dari 50.

Pemuatan harus menangani save yang tidak ada atau tidak lengkap. Game balap menyimpan RaceSave; versi 2 game menambahkan musicVolume:

[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();
}

Pemain baru tidak memiliki file, dan File.ReadAllText pada file yang tidak ada akan melempar FileNotFoundException, jadi periksa File.Exists terlebih dahulu dan mulai dengan new RaceSave(): 0 trofi, Rookie Kart, dan volume 0.8, sesuai nilai awal field. File pemain lama dari versi 1 berisi {"trophies":3,"car":"Red Racer"}. FromJson membuat RaceSave baru, yang menjalankan penginisialisasi field, lalu hanya mengatur key yang ada di JSON, sehingga musicVolume bernilai 0.8. Key yang tidak memiliki field di class akan diabaikan. Karena itu, versi baru game dapat membaca save lama, asalkan setiap field baru memiliki penginisialisasi dengan nilai yang wajar.

JsonUtility.FromJsonOverwrite(json, obj) mengisi object yang sudah ada alih-alih membuat object baru, dan membiarkan setiap field yang tidak ada di JSON tetap seperti sebelumnya. FromJson tidak dapat membuat MonoBehaviour atau ScriptableObject (Unity melempar Cannot deserialize JSON to new instances of type 'RaceSettings.'), jadi asset pengaturan dimuat dengan menimpanya: JsonUtility.FromJsonOverwrite(json, settings);. Cara ini juga mempertahankan nilai yang sudah dimiliki object, seperti nilai yang diberikan Inspector, sedangkan FromJson akan mengembalikan nilai awal class.

challenge icon

Tantangan

Sedang

Hewan peliharaan virtual memuat pet.json saat game dimulai, dan tombol Space memberi makan hewan peliharaan lalu menyimpannya. Proses pemuatan bisa bermasalah dalam dua hal:

  • Pemain baru belum memiliki pet.json, dan Start berhenti dengan FileNotFoundException. Jika tidak ada file, pertahankan hewan peliharaan yang disiapkan di Inspector (Biscuit, hunger 30, happiness 80, sebuah Ball) dan catat A new pet: Biscuit.
  • Versi 1 game hanya menyimpan petName dan hunger; happiness dan toys ditambahkan di versi 2 (lihat PetSave.cs). Save lama yang dimuat dengan FromJson akan mendapatkan nilai 50 dari class dan tidak memiliki toys, bukan nilai dari Inspector. Muat file yang sudah ada ke dalam pet dengan JsonUtility.FromJsonOverwrite, sehingga apa pun yang tidak ada di file tetap menggunakan nilai dari Inspector, lalu catat ucapan selamat datang dengan nama yang dimuat, seperti Welcome back, Mochi.

Tekan Play dan beri makan hewan peliharaan, lalu tekan Stop dan Play lagi, kemudian tekan Check.

Coba sendiri

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 iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Arsitektur Game di Unity