unity-ScriptableObject 粗解

ScriptableObject类概述、属性及函数

首先提供官方参考文档:API-Reference-ScriptableObject & Scriptable-Manual & SctiptableObject-Candycat

概述: ScriptableObject类直接继承自Object类;它和MonoBehaviour是并列的,都继承自Object(但MonoBehaviour并不是直接继承自Object),会在后面介绍ScriptableObject和MonoBehavior的比较;

脚本化对象就是一个数据容器,可以用来存储大量的数据,它是可序列化的,这个特点也正决定了它的主要用途;一个主要用处就是通过将数据存储在ScriptableObject对象中来减少工程以及游戏运行时因拷贝值所造成的内存占用;

ScriptableObject与预制体:当你有一个预制体,它附加了一些mono脚本,包含了一些数据,每次我们实例化预制体的时候它都会拷贝assets下原预制体的值生成一份自己的拷贝,然后我们可以修改场景内预制体的值而并不影响assets下预制体的值,这是prefab的特性,对于我们从一个prefab模板生成属性不同的游戏对象是很有用的,但是如果prefab里的脚本数据是不需要修改的,它就会造成很大的资源浪费,尤其在数据很多的时候;为了避免这种问题,我们可以在不需要修改prefab里的脚本数据时,考虑使用ScriptableObject来存储这些重复的数据,然后其它所有预制体都可以使用引用的方式来访问这份数据,这就意味着不管场景中实例了多少预制体,在内存中就只需要有一份数据;它所带给我们的启示就是,当预制体中的脚本里有大量重复数据时,我们要想着将数据抽离,单独保存在本地;

应用场景及方式:当使用编辑器运行游戏的时候,可以将数据保存到ScriptableObject里(当创建一个脚本化对象实例后使用AssetDatabase.CreateAsset()保存该资源),退出之后也不会丢失,因为它是作为Assets下的资源存在的;它是仅在编辑器中才可以保存修改的数据(因为ScriptableObject对象虽然声明在UnityEngine中,但是它的Scriptable是通过UnityEditor命名空间下的类例如Editor类等来实现的),所以在部署构建的时候不可以用于存储游戏运行时更改的数据,但是可以使用之前存储好的数据,也就是ScriptableObject生成的数据资源文件在Editor外具有只读属性,这是非常需要注意的一点,如果你需要在游戏中修改数据并存储下来,就不推荐使用ScriptableObject了;

我的理解

  1. 数据Prefab
  2. 多数情况下编辑器用的
  3. 占空间,实机时建议不要用

我的扩展

通过编辑器中转
Excel => ScriptableObject => Sqlite

  1. Excel 重复编辑快,是人都能懂
  2. ScriptableObject 图形化,Debug用,测试稳定。
    需要定制输入成本高
  3. Sqlite 数据库轻,读取形式
  4. Json 存档害得是Json,好读!
  5. Bin 加密 加密 加密

我的拙见

  1. 市面上轮子很多,但是我还是要再造
  2. 明明很多数据存储方式。却没有项目大中小情况的数据储存建议