ScriptableObject
ScriptableObject
ScriptableObject 是一个可独立于类实例来保存大量数据的数据容器。
ScriptableObject 的一个主要用例是通过避免重复值来减少项目的内存使用量。
使用 ScriptableObject
- 在 Editor 会话期间保存和存储数据
- 将数据保存为项目中的资源,以便在运行时使用
要使用 ScriptableObject,必须在应用程序的 Assets 文件夹中创建一个脚本,并使其继承自 ScriptableObject 类。
using UnityEngine;
[CreateAssetMenu(fileName = "Data", menuName = "ScriptableObjects/SpawnManagerScriptableObject", order = 1)]
public class SpawnManagerScriptableObject : ScriptableObject
{
public string prefabName;
public int numberOfPrefabsToCreate;
public Vector3[] spawnPoints;
}
您可以通过导航到 Assets > Create > ScriptableObjects > SpawnManagerScriptableObject 来创建 ScriptableObject 的实例。
为新的 ScriptableObject 实例提供有意义的名称并更改值。要使用这些值,必须创建一个引用 ScriptableObject(在本例中为 SpawnManagerScriptableObject)的新脚本。例如:
using UnityEngine;
public class Spawner : MonoBehaviour
{
// 要实例化的游戏对象。
public GameObject entityToSpawn;
//上面定义的 ScriptableObject 的一个实例。
public SpawnManagerScriptableObject spawnManagerValues;
//这将附加到创建的实体的名称,并在创建每个实体时递增。
int instanceNumber = 1;
void Start()
{
SpawnEntities();
}
void SpawnEntities()
{
int currentSpawnPointIndex = 0;
for (int i = 0; i < spawnManagerValues.numberOfPrefabsToCreate; i++)
{
//在当前生成点处创建预制件的实例。
GameObject currentEntity = Instantiate(entityToSpawn, spawnManagerValues.spawnPoints[currentSpawnPointIndex], Quaternion.identity);
//将实例化实体的名称设置为 ScriptableObject 中定义的字符串,然后为其附加一个唯一编号。
currentEntity.name = spawnManagerValues.prefabName + instanceNumber;
// 移动到下一个生成点索引。如果超出范围,则回到起始点。
currentSpawnPointIndex = (currentSpawnPointIndex + 1) % spawnManagerValues.spawnPoints.Length;
instanceNumber++;
}
}
}