JsonUtility
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 30 trên 64.
JSON là văn bản chứa các giá trị của một đối tượng, nên bạn có thể ghi nhật ký, gửi hoặc ghi nó vào tệp. JsonUtility.ToJson(obj) chuyển một đối tượng thành JSON, còn JsonUtility.FromJson<T>(json) tạo một T mới từ JSON đó. JsonUtility tuân theo các quy tắc của Inspector, nên có thể dùng với lớp [System.Serializable]:
[System.Serializable]
public class PlayerProfile
{
public string playerName = "Ana";
public int level = 7;
public List<string> badges = new List<string> { "Explorer", "Sharpshooter" };
[SerializeField] private float hoursPlayed = 12.5f;
private int secretCode = 1234;
public int Rank { get; set; } = 3;
}string json = JsonUtility.ToJson(new PlayerProfile());
// {"playerName":"Ana","level":7,"badges":["Explorer","Sharpshooter"],"hoursPlayed":12.5}
PlayerProfile copy = JsonUtility.FromJson<PlayerProfile>(json);secretCode và Rank không xuất hiện. JsonUtility ghi các trường public và các trường private có đánh dấu [SerializeField], không ghi gì khác: không ghi thuộc tính, trường static hay trường private thông thường. Trường kiểu Dictionary cũng bị bỏ qua, và trường có lớp không được đánh dấu [System.Serializable] cũng vậy. Inspector cũng bỏ qua những trường đó. JsonUtility.ToJson(obj, true) ghi cùng một JSON nhưng trải trên nhiều dòng, giúp bạn dễ đọc hơn.
Danh sách bên trong một lớp sẽ được ghi, như badges. Danh sách đứng riêng thì không: JsonUtility cần một đối tượng ở ngoài cùng, nên JsonUtility.ToJson(scores) với một List<int> chứa 10, 20 và 30 sẽ trả về {}. Hãy đặt danh sách vào một lớp rồi chuyển đổi lớp đó. Một ScoreBoard chứa cùng danh sách sẽ được ghi thành {"scores":[10,20,30]}:
[System.Serializable]
public class ScoreBoard
{
public List<int> scores;
}Thử thách
Trung bìnhChia sẻ đội dưới dạng đoạn code JSON.
- Trong
CharacterBuild, tạoStrengththành một trường,public int strength;, và đánh dấuagilitybằng[SerializeField]. - Bên dưới, viết một lớp
[System.Serializable]tên làTeamvớipublic List<CharacterBuild> heroes;. TrongTeamCode, khai báo danh sách bằngpublic Team team;rồi ghi nhật ký JSON của danh sách. LoadCodeđọccodevàoteamrồi ghi nhật kýLoaded 3 heroes.
Nhấn Chơi rồi nhấn Space: đội sẽ hiển thị dưới dạng JSON. Sau đó nhấn Kiểm tra.
Tự làm thử
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]
public class CharacterBuild
{
public string hero;
public int Strength { get; set; }
private int agility;
}
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