Muat dan Nilai Default
Termasuk bagian Arsitektur Game di Unity dalam perjalanan Unity di Coddy. Pelajaran 32 dari 64.
Pemuatan harus menangani penyimpanan yang tidak ada atau belum lengkap. Game balapan 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 akan melempar FileNotFoundException jika file tidak ditemukan, jadi periksa File.Exists terlebih dahulu dan mulai dengan new RaceSave(): 0 trofi, Rookie Kart, dan volume 0.8, yaitu nilai awal field. File versi 1 milik pemain lama berisi {"trophies":3,"car":"Red Racer"}. FromJson membuat RaceSave baru, yang menjalankan nilai awal field, lalu hanya mengatur key yang ada di JSON, jadi musicVolume bernilai 0.8. Key yang tidak memiliki field di class akan diabaikan. Karena itu, versi baru game dapat membaca penyimpanan lama, selama setiap field baru memiliki nilai awal yang masuk akal.
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);. Penimpaan juga mempertahankan nilai yang sudah dimiliki object, seperti nilai yang diberikan Inspector, sedangkan FromJson akan mengembalikan nilai awal class.
Tantangan
SedangMuat pet.json dengan aman untuk pemain baru dan data simpanan lama.
- Di
Start(), ganti baris FromJson denganif (File.Exists(path))danelse. - Jika ada file, isi pet di Inspector:
JsonUtility.FromJsonOverwrite(File.ReadAllText(path), pet);, lalu catatWelcome back, Mochidaripet.petName. - Jika tidak ada file, catat
A new pet: Biscuitdengan cara yang sama.
Tekan tombol “Main”, beri makan hewan peliharaan, lalu tekan Stop dan Main: pesannya menyatakan selamat datang kembali. Lalu tekan tombol “Periksa”.
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;
}
}
Semua pelajaran di Arsitektur Game di Unity
1Komponen, Bukan Hierarki
Komponen KecilSkrip Dasar MusuhKomponen AbstrakKomponen yang Bekerja BersamaRangkuman: Turret ModularRangkuman: Meriam Kembar4Data yang Diserialisasi
Class yang Dapat DiserialisasiList di InspectorEnum di InspectorRangkuman: Tabel LootRangkuman: Acak Loot2Antarmuka di Unity
IDamageableAntarmuka dan TryGetComponentGetComponentsRingkasan: Tombol InteractRingkasan: Terdekat dalam Jangkauan5ScriptableObjects
Aset DataStatistik SenjataPengaturan BersamaSelamatkan AnginGelombang sebagai DataRekap: database ItemBeli dari Toko8Kode yang Dapat Digunakan Kembali
Extension methodSingleton GenerikHelper GenerikUlasan: FindNearest3Event
Event C# di UnityBerlangganan di OnEnableField UnityEventEvent Menggerakkan UIRangkuman: Popup PencapaianRangkuman: Timer Popup6Menyimpan dengan JSON
JsonUtilitySimpan GameMuat dan Nilai DefaultRingkasan: Slot SimpananPilih dan Hapus SlotLatihan sendiri: Playground Unity