在 Unity 中创建 ScriptableObject

Unity 中的 ScriptableObject 是一种特殊类型的类,允许创建可重用的数据驱动对象。它通常用于存储和管理游戏数据、配置和设置,但也可用于多种目的,例如管理游戏设置、创建数据驱动系统、定义角色能力、存储对话或查询信息等。它提供了一种灵活有效的方式来组织和管理Unity项目中的数据。

ScriptableObjects 的主要优点是它们提供了一种创建数据容器的方法,可以在多个脚本实例之间轻松共享和重用。它们可以被认为是用于创建特定数据类型的实例的 "blueprints"。可以创建 ScriptableObject 的多个实例并独立修改它们的数据。

创建一个可编写脚本的对象

ScriptableObject 可以在 Unity 编辑器中创建并保存为项目中的资源。与 MonoBehaviour 脚本不同,ScriptableObject 不附加到场景中的 GameObject,但可以被其他脚本引用和使用。

要创建 ScriptableObject,请执行以下步骤:

  • Unity 编辑器 中,右键单击项目窗口并导航到 "Create -> C# ScriptableObject"。
  • 为其指定一个有意义的名称,然后在首选代码编辑器中打开脚本。

定义 ScriptableObject 类:

  • 在脚本中,继承自ScriptableObject类。
  • 定义公共字段或属性来表示要存储在 ScriptableObject 中的数据。
using UnityEngine;

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

在上面的示例中,我们定义了一个具有两个公共字段的 ScriptableObject 类:'dataName (string)' 和 'dataValue (int)'

在检查器中自定义 ScriptableObject:

  • 使用 '[SerializeField]' 等属性将特定字段公开给 Unity 检查器进行修改,同时保持这些字段无法从将使用该 ScriptableObject 的脚本访问。
using UnityEngine;

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

    [SerializeField]
    private int dataValue;
}

创建 ScriptableObjects 的实例:

  • 在 Unity 编辑器中,右键单击“项目”窗口并选择 "Create" 以创建 ScriptableObject 的实例。
  • 在 Inspector 中自定义创建的实例的数据。

从其他脚本访问 ScriptableObject 数据:

  • 在 MonoBehaviour 脚本或任何其他脚本中,创建 ScriptableObject 类型的公共或序列化字段,并在检查器视图中分配它。
using UnityEngine;

public class MyBehaviour : MonoBehaviour
{
    public MyScriptableObject myData;
}
  • 然后可以通过分配的字段访问 ScriptableObject 实例的数据。
using UnityEngine;

public class MyBehaviour : MonoBehaviour
{
    public MyScriptableObject myData;

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

结论

ScriptableObjects 是一种用于管理和组织游戏项目中的数据的多功能工具。 通过创建可重用和可定制的数据容器,ScriptableObjects 提供了一种灵活有效的方式来存储配置、设置和其他非实例特定信息。 由于能够创建 ScriptableObject 的多个实例并独立修改其数据,因此可以轻松创建数据驱动系统、管理游戏设置、定义角色能力、存储对话或任务信息等等。 利用 ScriptableObjects 增强了 Unity 项目的可重用性、可维护性和可扩展性,最终简化了开发过程并支持创建更强大和动态的游戏。

推荐文章
在 Unity 中实现对象池
在 Unity 中创建 2D 尖峰
在 Unity 中实现计时器
受 Poppy Playtime 启发,在 Unity 中创建 GrabPack
在 Unity 中创建子弹时间效果
在 Unity 中创建交互式对象
在 Unity 中实现动力学交互