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.
Thử thách
Trung bìnhTải pet.json an toàn cho người chơi mới và các bản lưu cũ.
- Trong
Start(), thay dòng FromJson bằngif (File.Exists(path))vàelse. - 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, Mochitừpet.petName. - Nếu không có tệp, ghi nhật ký
A new pet: Biscuittheo 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
1Thành phần, không phải hệ thống phân cấp
Thành phần nhỏTập lệnh kẻ địch cơ sởThành phần trừu tượngCác thành phần phối hợp với nhauÔn tập: tháp pháo mô-đunÔn tập: pháo nòng đôi4Dữ liệu tuần tự hóa
Lớp có thể tuần tự hóaDanh sách trong InspectorKiểu liệt kê trong InspectorÔn tập: Bảng vật phẩm rơiÔn tập: Quay vật phẩm2Giao diện trong Unity
IDamageableGiao diện và TryGetComponentGetComponentsÔn tập: phím tương tácÔn tập: đối tượng gần nhất trong tầm với5ScriptableObjects
Tài sản dữ liệuChỉ số vũ khíCài đặt dùng chungLưu gióSóng dưới dạng dữ liệuÔn tập: Cơ sở dữ liệu vật phẩmÔn tập: Mua hàng từ cửa hàng8Code có thể tái sử dụng
Phương thức mở rộngSingleton tổng quátCác hàm hỗ trợ tổng quátÔn tập: FindNearest3Sự kiện
Sự kiện C# trong UnityĐăng ký trong OnEnableCác trường UnityEventSự kiện điều khiển UIÔn tập: Cửa sổ bật lên thành tíchÔn tập: Bộ hẹn giờ cửa sổ bật lên6Lưu dữ liệu bằng JSON
JsonUtilityLưu trò chơiTải dữ liệu và giá trị mặc địnhÔn tập: các ô lưuChọn và xóa một ô lưu9Tái sử dụng đối tượng bằng pool
Vì sao cần pool đối tượngPool dùng hàng đợiObjectPool của UnityÔn tập: pool đạnTự luyện tập: Playground Unity