ScriptableObject 是一个数据容器,您可以使用它来保存大量数据,独立于类实例。ScriptableObject 的主要用例之一是通过避免值副本来减少项目的内存使用量。如果您的项目有 预制件一种可以存储包含组件和属性的完整游戏对象的资源类型。预制件充当模板,您可以从中在场景中创建新的对象实例。 更多信息
参见 词汇表 在附加的 MonoBehaviour 脚本一段代码,允许您创建自己的组件、触发游戏事件、随着时间的推移修改组件属性以及以您喜欢的任何方式响应用户输入。 更多信息
参见 词汇表 中存储不变的数据,则此方法很有用。
每次实例化该预制件时,它都会获得该数据的副本。与其使用这种方法并存储重复数据,不如使用 ScriptableObject 来存储数据,然后通过引用从所有预制件访问它。这意味着内存中只有一份数据副本。
与 MonoBehaviour 类似,ScriptableObject 继承自基类 UnityEngine.Object
,但与 MonoBehaviour 不同,您不能将 ScriptableObject 附加到 游戏对象Unity 场景中的基本对象,可以表示角色、道具、场景、摄像机、路径点等等。游戏对象的的功能由附加到它的组件定义。 更多信息
参见 词汇表。相反,您需要将它们保存为项目中的资源。
使用 Unity 编辑器时,您可以在编辑时和运行时将数据保存到 ScriptableObject,因为 ScriptableObject 使用编辑器命名空间和编辑器脚本。但是,在部署的构建中,您不能使用 ScriptableObject 保存数据,但可以使用在开发过程中设置的 ScriptableObject 资源中的保存数据。
将数据从编辑器工具保存到 ScriptableObject 作为资源时,Unity 会将数据写入磁盘,并在会话之间保持持久性。
本页概述了 ScriptableObject 类及其在使用它进行脚本编写时的常见用法。有关 ScriptableObject 类每个成员的完整参考,请参阅 ScriptableObject 脚本参考。
ScriptableObject 的主要用例是
ScriptableObject 必须继承自 ScriptableObject 类。
要创建新的 ScriptableObject 脚本,请执行以下操作之一
您可以使用 CreateAssetMenu 属性使用您的类创建自定义资源。例如
using UnityEngine;
[CreateAssetMenu(fileName = "Data", menuName = "ScriptableObjects/SpawnManagerScriptableObject", order = 1)]
public class SpawnManagerScriptableObject : ScriptableObject
{
public string prefabName;
public int numberOfPrefabsToCreate;
public Vector3[] spawnPoints;
}
在您的 资源任何可以用于您的游戏或项目的媒体或数据。资源可能来自在 Unity 之外创建的文件,例如 3D 模型、音频文件或图像。您也可以在 Unity 中创建一些资源类型,例如动画控制器、音频混音器或渲染纹理。 更多信息
参见 词汇表 文件夹中,您可以通过导航到 资源 > 创建 > ScriptableObjects > SpawnManagerScriptableObject 来创建 ScriptableObject 实例。为新的 ScriptableObject 实例命名一个有意义的名称,并更改值。要使用这些值,您需要创建一个引用 ScriptableObject 的新脚本,在本例中为 SpawnManagerScriptableObject
。例如
using UnityEngine;
public class Spawner : MonoBehaviour
{
// The GameObject to instantiate.
public GameObject entityToSpawn;
// An instance of the ScriptableObject defined above.
public SpawnManagerScriptableObject spawnManagerValues;
// This will be appended to the name of the created entities and increment when each is created.
int instanceNumber = 1;
void Start()
{
SpawnEntities();
}
void SpawnEntities()
{
int currentSpawnPointIndex = 0;
for (int i = 0; i < spawnManagerValues.numberOfPrefabsToCreate; i++)
{
// Creates an instance of the prefab at the current spawn point.
GameObject currentEntity = Instantiate(entityToSpawn, spawnManagerValues.spawnPoints[currentSpawnPointIndex], Quaternion.identity);
// Sets the name of the instantiated entity to be the string defined in the ScriptableObject and then appends it with a unique number.
currentEntity.name = spawnManagerValues.prefabName + instanceNumber;
// Moves to the next spawn point index. If it goes out of range, it wraps back to the start.
currentSpawnPointIndex = (currentSpawnPointIndex + 1) % spawnManagerValues.spawnPoints.Length;
instanceNumber++;
}
}
}
注意:脚本文件必须与类同名。
将前面的脚本附加到您 场景场景包含您的游戏环境和菜单。将每个唯一的场景文件视为一个唯一的关卡。在每个场景中,您放置您的环境、障碍物和装饰,本质上是分段设计和构建您的游戏。 更多信息
参见 词汇表 中的游戏对象。然后,在 检查器一个 Unity 窗口,显示有关当前选定游戏对象、资源或项目设置的信息,允许您检查和编辑值。 更多信息
参见 词汇表 中,将 生成管理器值 字段设置为您设置的新的 SpawnManagerScriptableObject
。
将 要生成的对象 字段设置为您的资源文件夹中的任何预制件,然后单击编辑器中的 播放。您在 Spawner
中引用的预制件将使用您在 SpawnManagerScriptableObject
实例中设置的值进行实例化。
如果您在检查器中使用 ScriptableObject 引用,您可以双击引用字段以打开 ScriptableObject 的检查器。您还可以创建自定义编辑器来定义类型的检查器外观,以帮助管理它表示的数据。