概念

ScriptableObject 是一个可独立于类实例来保存大量数据的数据容器。ScriptableObject 的一个主要用例是通过避免重复值来减少项目的内存使用量。如果项目有一个预制件在附加的 MonoBehaviour 脚本中存储不变的数据,这将非常有用。
每次实例化预制件时,都会产生单独的数据副本。这种情况下可以不使用该方法并且不存储重复数据,而是使用 ScriptableObject 来存储数据,然后通过所有预制件的引用访问数据。这意味着内存中只有一个数据副本。
就像 MonoBehaviour 一样,ScriptableObject 派生自基本 Unity 对象,但与 MonoBehaviour 不同,不能将 ScriptableObject 附加到游戏对象。正确的做法是需要将它们保存为项目中的资源。

使用

1.创建类

  1. using UnityEngine;
  2. [CreateAssetMenu(fileName = "Data", menuName = "ScriptableObjects/SpawnManagerScriptableObject", order = 1)]
  3. public class SpawnManagerScriptableObject : ScriptableObject
  4. {
  5. public string prefabName;
  6. public int numberOfPrefabsToCreate;
  7. public Vector3[] spawnPoints;
  8. }

2.创建实例

image.png
image.png

3.使用实例

  1. using UnityEngine;
  2. public class Spawner : MonoBehaviour
  3. {
  4. // 要实例化的游戏对象。
  5. public GameObject entityToSpawn;
  6. //上面定义的 ScriptableObject 的一个实例。
  7. public SpawnManagerScriptableObject spawnManagerValues;
  8. //这将附加到创建的实体的名称,并在创建每个实体时递增。
  9. int instanceNumber = 1;
  10. void Start()
  11. {
  12. SpawnEntities();
  13. }
  14. void SpawnEntities()
  15. {
  16. int currentSpawnPointIndex = 0;
  17. for (int i = 0; i < spawnManagerValues.numberOfPrefabsToCreate; i++)
  18. {
  19. //在当前生成点处创建预制件的实例。
  20. GameObject currentEntity = Instantiate(entityToSpawn, spawnManagerValues.spawnPoints[currentSpawnPointIndex], Quaternion.identity);
  21. //将实例化实体的名称设置为 ScriptableObject 中定义的字符串,然后为其附加一个唯一编号。
  22. currentEntity.name = spawnManagerValues.prefabName + instanceNumber;
  23. // 移动到下一个生成点索引。如果超出范围,则回到起始点。
  24. currentSpawnPointIndex = (currentSpawnPointIndex + 1) % spawnManagerValues.spawnPoints.Length;
  25. instanceNumber++;
  26. }
  27. }
  28. }