Tài sản dữ liệu
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 23 trên 64.
Một trò chơi nông trại trồng cà rốt và bí ngô. Cà rốt cần 30 giây để lớn và bán được 5 xu, bí ngô cần 90 giây và bán được 40 xu. Những con số đó thuộc về cây trồng, không phải từng cây riêng lẻ: nếu dùng các trường Inspector trong script Plant, mỗi cây cà rốt ở mọi cảnh đều giữ một bản sao của 30 và 5, và muốn thay đổi thì phải tìm tất cả chúng. ScriptableObject lưu dữ liệu như vậy trong một tài sản, tức một tệp trong dự án mà bất kỳ số lượng đối tượng nào cũng có thể tham chiếu đến. Lớp này kế thừa từ ScriptableObject thay vì MonoBehaviour:
using UnityEngine;
[CreateAssetMenu(fileName = "NewPlant", menuName = "Farm/Plant Data")]
public class PlantData : ScriptableObject
{
public string plantName;
public float growTime;
public int sellPrice;
}[CreateAssetMenu] đưa lớp vào menu Create của cửa sổ Project. Nhấp chuột phải trong cửa sổ Project, chọn Create > Farm > Plant Data, và Unity tạo một tài sản tên là NewPlant; đổi tên nó thành Carrot, chọn nó, rồi nhập Carrot, 30 và 5 vào các trường trong Inspector. Tạo tài sản Pumpkin theo cách tương tự. Lớp này nằm trong tệp mang tên lớp, PlantData.cs, giống như MonoBehaviour.
Phần hành vi nằm trong một MonoBehaviour có trường thuộc kiểu của tài sản. Kéo tài sản Carrot vào trường đó, rồi script đọc các con số thông qua trường này:
public class Plant : MonoBehaviour
{
public PlantData data;
private float age;
void Update()
{
age += Time.deltaTime;
if (age >= data.growTime)
{
Debug.Log(data.plantName + " is ready, worth " + data.sellPrice);
enabled = false;
}
}
}ScriptableObject không gắn với GameObject nào và không nằm trong cảnh nào. Nó không có Transform, và Unity không bao giờ gọi Update hoặc Start của nó: nó lưu dữ liệu, còn Plant giữ phần hành vi. Khi 200 cây cà rốt cùng tham chiếu đến tài sản Carrot, đặt growTime thành 25 sẽ thay đổi cả 200 cây. Trong code, tạo một instance bằng ScriptableObject.CreateInstance<PlantData>(), không bao giờ dùng new.
Thử thách
Trung bìnhChuyển các thiết lập của anh hùng vào một tài nguyên dữ liệu.
- Trong
HeroData.cs, viếtpublic class HeroData : ScriptableObjectvới các thành viên công khaistring heroName,float moveSpeedvàColor color. - Đặt
[CreateAssetMenu(menuName = "Heroes/Hero Data")]ở dòng ngay phía trên. - Trong
Hero.cs, thay ba trường bằngpublic HeroData data;, rồi đọcdata.heroName,data.moveSpeedvàdata.colorthay vào đó.
Nhấn Chơi: Hiệp sĩ đỏ đi bộ với tốc độ 3. Sau đó nhấn Kiểm tra.
Tự làm thử
using UnityEngine;
// HeroData: tên, tốc độ và màu sắc của nhân vật chính dưới dạng ScriptableObject
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