简介
Unity官方说法:ScriptableObject 是一个可独立于类实例来保存大量数据的数据容器。ScriptableObject 的一个主要用例是通过避免重复值来减少项目的内存使用量。如果项目有一个预制件在附加的 MonoBehaviour 脚本中存储不变的数据,这将非常有用。
说人话就是ScriptObject可以作为数据容器,本质上是一个配置文件,我们可以用来作为自定义的数据资源文件。
就像 MonoBehaviour 一样,ScriptableObject 派生自 Unity 基本 Object 类,但与 MonoBehaviour 不同,不能将 ScriptableObject 挂载到到Game Object上。
作用
由于每次实例化Prefab时,都会产生单独的数据副本。这种情况下可以不使用该方法并且不存储重复数据,而是使用 ScriptableObject 来存储数据,然后通过所有Prefab的引用访问数据。这意味着内存中只有一个数据副本。
Unity编辑器可以在编辑时和运行时将数据保存到 ScriptableObject,因为 ScriptableObject 使用 Editor 命名空间和 Editor 脚本。但是在游戏打包出来之后不能使用 ScriptableObject 来保存数据,但可以使用在开发期间设置的 ScriptableObject 资源中保存的数据。意思就是说,ScriptableObject只能在编辑器中进行数据持久化。因此Scriptable的正确打开方式是用来做各类配置文件,以及存储不变的数据(比如物品属性配置、敌人属性配置)等,而不是用来作为游戏存档的方式。
示例
比如在游戏中我们可能有很多种怪物,对于每一种怪物,可以创建一个SO文件作为其属性配置(如生命力、攻击力等)。然后在该怪物的Prefab上引用该SO作为其属性的数据源,就可以起到当创建了多个该怪物的实例时共享一份配置数据的作用。