Menu
CoddyTech

Tải dữ liệu và giá trị mặc định

Thuộc phần Kiến trúc trò chơi trong Unity trong hành trình Unity của Coddy. Bài học 32 trên 64.

Quá trình tải phải xử lý được các tệp lưu không tồn tại hoặc chưa đầy đủ. Một trò chơi đua xe lưu dữ liệu trong RaceSave; phiên bản 2 của trò chơi đã thêm 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();
}

Người chơi mới chưa có tệp, còn File.ReadAllText sẽ ném ra FileNotFoundException nếu tệp không tồn tại, vì vậy hãy kiểm tra File.Exists trước và bắt đầu bằng new RaceSave(): 0 cúp, chiếc Rookie Kart và âm lượng 0.8, các giá trị khởi tạo của trường. Tệp phiên bản 1 của người chơi cũ chứa {"trophies":3,"car":"Red Racer"}. FromJson tạo một RaceSave mới, chạy các giá trị khởi tạo của trường, rồi chỉ đặt những khóa có trong JSON, nên musicVolume có giá trị 0.8. Khóa nào không có trường tương ứng trong lớp sẽ bị bỏ qua. Vì vậy, phiên bản mới của trò chơi có thể đọc các tệp lưu cũ, miễn là mọi trường mới đều có giá trị khởi tạo hợp lý.

JsonUtility.FromJsonOverwrite(json, obj) điền dữ liệu vào một đối tượng đã tồn tại thay vì tạo đối tượng mới, đồng thời giữ nguyên mọi trường không có trong JSON. FromJson không thể tạo MonoBehaviour hoặc ScriptableObject (Unity ném ra Cannot deserialize JSON to new instances of type 'RaceSettings.'), nên bạn tải asset cài đặt bằng cách ghi đè lên nó: JsonUtility.FromJsonOverwrite(json, settings);. Cách ghi đè cũng giữ lại các giá trị mà đối tượng đã có, chẳng hạn như giá trị Inspector đã gán cho nó, trong khi FromJson sẽ khôi phục các giá trị khởi tạo của lớp.

challenge icon

Thử thách

Trung bình

Tải pet.json an toàn cho người chơi mới và các bản lưu cũ.

  1. Trong Start(), thay dòng FromJson bằng if (File.Exists(path)) và else.
  2. Nếu có tệp, điền dữ liệu vào pet trong Inspector: JsonUtility.FromJsonOverwrite(File.ReadAllText(path), pet);, rồi ghi nhật ký Welcome back, Mochi từ pet.petName.
  3. Nếu không có tệp, ghi nhật ký A new pet: Biscuit theo cách tương tự.

Nhấn Chơi, cho thú cưng ăn, rồi nhấn Dừng và Chơi: thông báo chào mừng bạn quay lại sẽ xuất hiện. Sau đó nhấn Kiểm tra.

Tự làm thử

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;
    }
}

Tất cả bài học trong Kiến trúc trò chơi trong Unity

Tự luyện tập: Playground Unity