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.
Tantangan
SedangHewan 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 catatA new pet: Biscuit. - Versi 1 game hanya menyimpan
petNamedanhunger;happinessdantoysditambahkan 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 dalampetdenganJsonUtility.FromJsonOverwrite, sehingga apa pun yang tidak ada di file tetap menggunakan nilai dari Inspector, lalu catat ucapan selamat datang dengan nama yang dimuat, sepertiWelcome 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;
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Arsitektur Game di Unity
1Komponen, Bukan Hierarki
Komponen KecilSkrip Dasar MusuhKomponen AbstrakKomponen yang Bekerja SamaRingkasan: Turret Modular5ScriptableObjects
Aset DataStatistik SenjataPengaturan BersamaGelombang sebagai DataUlasan: database Item8Kode yang Dapat Digunakan Kembali
Extension methodSingleton GenerikHelper GenerikUlasan: FindNearest