Menu
CoddyTech

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.

challenge icon

Tantangan

Sedang

Muat pet.json dengan aman untuk pemain baru dan data simpanan lama.

  1. Di Start(), ganti baris FromJson dengan if (File.Exists(path)) dan else.
  2. Jika ada file, isi pet di Inspector: JsonUtility.FromJsonOverwrite(File.ReadAllText(path), pet);, lalu catat Welcome back, Mochi dari pet.petName.
  3. Jika tidak ada file, catat A new pet: Biscuit dengan 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

Latihan sendiri: Playground Unity