Tạo ScriptableObjects trong Unity

ScriptableObject trong Unity là một loại lớp đặc biệt cho phép tạo các đối tượng dựa trên dữ liệu, có thể tái sử dụng. Nó thường được sử dụng để lưu trữ và quản lý dữ liệu, cấu hình và cài đặt trò chơi, nhưng cũng có thể được sử dụng cho nhiều mục đích khác nhau, chẳng hạn như quản lý cài đặt trò chơi, tạo hệ thống dựa trên dữ liệu, xác định khả năng của nhân vật, lưu trữ dialogue hoặc thông tin về nhiệm vụ, v.v. Nó cung cấp một cách linh hoạt và hiệu quả để tổ chức và quản lý dữ liệu trong các dự án Unity.

Ưu điểm chính của ScriptableObjects là chúng cung cấp cách tạo các thùng chứa dữ liệu có thể dễ dàng chia sẻ và sử dụng lại trên nhiều phiên bản của tập lệnh. Chúng có thể được coi là "blueprints" để tạo các phiên bản của một loại dữ liệu cụ thể. Có thể tạo nhiều phiên bản của ScriptableObject và sửa đổi dữ liệu của chúng một cách độc lập.

Tạo một đối tượng Scriptable

ScriptableObject có thể được tạo trong trình chỉnh sửa Unity và được lưu dưới dạng nội dung trong dự án. Không giống như các tập lệnh MonoBehaviour, ScriptableObject không được gắn vào GameObject trong cảnh nhưng có thể được các tập lệnh khác tham chiếu và sử dụng.

Để tạo một ScriptableObject, hãy làm theo các bước dưới đây:

  • Trong trình soạn thảo Unity, nhấp chuột phải vào cửa sổ Project và điều hướng đến "Create -> C# ScriptableObject".
  • Đặt cho nó một cái tên có ý nghĩa và mở tập lệnh trong trình chỉnh sửa mã ưa thích.

Xác định lớp ScriptableObject:

  • Trong tập lệnh, kế thừa từ lớp ScriptableObject.
  • Xác định các trường hoặc thuộc tính công khai để thể hiện dữ liệu cần lưu trữ trong ScriptableObject.
using UnityEngine;

[CreateAssetMenu(fileName = "NewData", menuName = "MyGame/ScriptableObject")]
public class MyScriptableObject : ScriptableObject
{
    public string dataName;
    public int dataValue;
}

Trong ví dụ trên, chúng ta định nghĩa một lớp ScriptableObject với hai trường công khai: 'dataName (string)' và 'dataValue (int)'.

Tùy chỉnh ScriptableObject trong Thanh tra:

  • Sử dụng các thuộc tính như '[SerializeField]' để hiển thị các trường cụ thể cho Unity Inspector để sửa đổi trong khi vẫn giữ cho các trường đó không thể truy cập được từ tập lệnh sẽ sử dụng ScriptableObject đó.
using UnityEngine;

[CreateAssetMenu(fileName = "NewData", menuName = "MyGame/ScriptableObject")]
public class MyScriptableObject : ScriptableObject
{
    [SerializeField]
    private string dataName;

    [SerializeField]
    private int dataValue;
}

Tạo các phiên bản của ScriptableObjects:

  • Trong trình soạn thảo Unity, nhấp chuột phải vào cửa sổ Project và chọn "Create" để tạo một phiên bản của ScriptableObject.
  • Tùy chỉnh dữ liệu của phiên bản đã tạo trong Thanh tra.

Truy cập dữ liệu ScriptableObject từ các tập lệnh khác:

  • Trong tập lệnh MonoBehaviour hoặc bất kỳ tập lệnh nào khác, hãy tạo một trường công khai hoặc được tuần tự hóa thuộc loại ScriptableObject và gán nó trong chế độ xem Thanh tra.
using UnityEngine;

public class MyBehaviour : MonoBehaviour
{
    public MyScriptableObject myData;
}
  • Sau đó, dữ liệu của phiên bản ScriptableObject có thể được truy cập thông qua trường được chỉ định.
using UnityEngine;

public class MyBehaviour : MonoBehaviour
{
    public MyScriptableObject myData;

    private void Start()
    {
        Debug.Log("Data Name: " + myData.dataName);
        Debug.Log("Data Value: " + myData.dataValue);
    }
}

Phần kết luận

ScriptableObjects là một công cụ linh hoạt để quản lý và sắp xếp dữ liệu trong các dự án trò chơi. Bằng cách tạo các vùng chứa dữ liệu có thể tùy chỉnh và tái sử dụng, ScriptableObjects cung cấp một cách linh hoạt và hiệu quả để lưu trữ cấu hình, cài đặt và thông tin không dành riêng cho phiên bản khác. Với khả năng tạo nhiều phiên bản của ScriptableObject và sửa đổi dữ liệu của chúng một cách độc lập, việc tạo các hệ thống dựa trên dữ liệu, quản lý cài đặt trò chơi, xác định khả năng của nhân vật, lưu trữ thông tin hội thoại hoặc nhiệm vụ, v.v., trở nên dễ dàng. Việc sử dụng ScriptableObjects sẽ nâng cao khả năng sử dụng lại, khả năng bảo trì và khả năng mở rộng của các dự án Unity, cuối cùng là hợp lý hóa quy trình phát triển và hỗ trợ việc tạo ra các trò chơi mạnh mẽ và năng động hơn.