Menu
CoddyTech

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.

challenge icon

Thử thách

Trung bình

Chuyển các thiết lập của anh hùng vào một tài nguyên dữ liệu.

  1. Trong HeroData.cs, viết public class HeroData : ScriptableObject với các thành viên công khai string heroName, float moveSpeed và Color color.
  2. Đặt [CreateAssetMenu(menuName = "Heroes/Hero Data")] ở dòng ngay phía trên.
  3. Trong Hero.cs, thay ba trường bằng public HeroData data;, rồi đọc data.heroName, data.moveSpeed và data.color thay 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

Tự luyện tập: Playground Unity