概念
ScriptableObject 是一个可独立于类实例来保存大量数据的数据容器。ScriptableObject 的一个主要用例是通过避免重复值来减少项目的内存使用量。如果项目有一个预制件在附加的 MonoBehaviour 脚本中存储不变的数据,这将非常有用。
每次实例化预制件时,都会产生单独的数据副本。这种情况下可以不使用该方法并且不存储重复数据,而是使用 ScriptableObject 来存储数据,然后通过所有预制件的引用访问数据。这意味着内存中只有一个数据副本。
就像 MonoBehaviour 一样,ScriptableObject 派生自基本 Unity 对象,但与 MonoBehaviour 不同,不能将 ScriptableObject 附加到游戏对象。正确的做法是需要将它们保存为项目中的资源。
使用
1.创建类
using UnityEngine;[CreateAssetMenu(fileName = "Data", menuName = "ScriptableObjects/SpawnManagerScriptableObject", order = 1)]public class SpawnManagerScriptableObject : ScriptableObject{public string prefabName;public int numberOfPrefabsToCreate;public Vector3[] spawnPoints;}
2.创建实例
3.使用实例
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++;}}}

