当前位置:   article > 正文

scriptableobject类理解

scriptableobject

ScriptableObject是一个数据容器,它可以用来保存大量数据,主要的用处就是在项目中通过将数据存储在ScriptableObject对象,避免值拷贝来减少游戏运行中的内存占用。

当你有一个预制体,上面挂了一个存有不变数据的MonoBehaviour 脚本时,每次我们实例化预制体时都将产生一次数据拷贝,这时我们可以使用ScriptableObject对象来存储数据,然后通过引用来访问预制体中的数据。这样可以避免在内存中产生一份拷贝数据。与MonoBehaviour 一样,ScriptableObject也继承自Unity基类object,但是与MonoBehaviour不同的是,ScriptableObject不能和GameObject对相关联,相反,通常我们会将它保存为Assets资源。

在编辑器模式下,我们可以在编辑和运行时将数据保存到ScriptableObject,因为保存ScriptableObject需要用到编辑器空间个脚本,但是在开发模式下不能使用ScriptableObject来保存数据,但是你可以使用ScriptableObject资源中已保存的数据。

游戏中我们创建并保存ScriptableObject数据时有两种方式

第一种:

  1. [CreateAssetMenu(fileName = "Data1", menuName = "ScriptableObjects/SpawnManagerScriptableObject1", order = 1)]
  2. public class SpawnManagerScriptableObject1 : ScriptableObject
  3. {
  4. public string prefabName;
  5. public int numberOfPrefabsToCreate;
  6. public Vector3[] spawnPoints;
  7. }
  8. [CreateAssetMenu(fileName = "Data1", menuName = "ScriptableObjects/SpawnManagerScriptableObject2", order = 2)]
  9. public class SpawnManagerScriptableObject2 : ScriptableObject
  10. {
  11. public string prefabName;
  12. public int numberOfPrefabsToCreate;
  13. public Vector3[] spawnPoints;
  14. }

在unity中可以看到已经生成了对应的工具选项如下:

第二种方式写法:

  1. public class MakeScriptableObject
  2. {
  3. [MenuItem("Assets/Create/My Scriptable Object")]
  4. public static void CreateMyAsset()
  5. {
  6. MyScriptableObjectClass asset = ScriptableObject.CreateInstance<MyScriptableObjectClass>();
  7. asset.init();
  8. AssetDatabase.CreateAsset(asset, "Assets/MyScripableObject.asset");
  9. AssetDatabase.SaveAssets();
  10. EditorUtility.FocusProjectWindow();
  11. Selection.activeObject = asset;
  12. }
  13. }
  14. public class MyScriptableObjectClass : ScriptableObject
  15. {
  16. public int age;
  17. public string name = "zxh";
  18. [Serializable]
  19. public class abc
  20. {
  21. public int grade;
  22. public int clas;
  23. }
  24. public abc ta;
  25. public void init()
  26. {
  27. age = 30;
  28. name = "hello";
  29. ta = new abc();
  30. ta.clas = 18;
  31. ta.grade = 19;
  32. }
  33. }

在unity中可以看到已经生成了对应的工具选项如下:

我们在挂有预制体的脚本中使用方式如下:

  1. using UnityEngine;
  2. public class Spawner : MonoBehaviour
  3. {
  4. // The GameObject to instantiate.
  5. public GameObject entityToSpawn;
  6. // An instance of the ScriptableObject defined above.
  7. public SpawnManagerScriptableObject spawnManagerValues;
  8. // This will be appended to the name of the created entities and increment when each is created.
  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. // Creates an instance of the prefab at the current spawn point.
  20. GameObject currentEntity = Instantiate(entityToSpawn, spawnManagerValues.spawnPoints[currentSpawnPointIndex], Quaternion.identity);
  21. // Sets the name of the instantiated entity to be the string defined in the ScriptableObject and then appends it with a unique number.
  22. currentEntity.name = spawnManagerValues.prefabName + instanceNumber;
  23. // Moves to the next spawn point index. If it goes out of range, it wraps back to the start.
  24. currentSpawnPointIndex = (currentSpawnPointIndex + 1) % spawnManagerValues.spawnPoints.Length;
  25. instanceNumber++;
  26. }
  27. }
  28. }

将上面的脚本挂到预制体上,然后将我们保存好的ScriptableObject数据赋给spawnManagerValues字段即可。

打开上述第二种方式生成的数据文件如下:

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/112479
推荐阅读
相关标签
  

闽ICP备14008679号