关于Unity3D中ScriptableObject的介绍

ScriptableObject是一个允许你存储大量独立于脚本实例的共享数据的类。不要将ScriptableObject类与SerializableObject类相混淆,SerializableObject类是一个编辑器类,并且用于不同的目的。例如,有这样的一个Prefab,它绑定了一个脚本,这个脚本里有一个整型数组,这个数组包含了一百万个整型数据。这个数组占用的内存大小为4MB并且是只属于这个Prefab的。每一次实例化这个Prefab,你都将会复制一份那个数组,如果你创建了10个game object,那么你最终将会为这10个实例创建总共40MB的数组数据。

Unity会将所有原始类型,字符串,数组,列表,专用于Unity的类型(如Vector3)和具有Seri​​alizable attribute的自定义类作为属于它们声明的对象的副本。这意味着如果你创建了一个ScriptableObject实例并且在它声明的整型数组中存储了一百万个整型数据,那么这个数组将与那个实例一起被存储起来。 这些实例被认为是拥有它们各自的数据。ScriptableObject中的字段或者是任何UnityEngine.Object的字段,例如MonoBehaviour,Mesh,GameObject等等,是通过引用方式被存储,而不是按值存储。如果你有一个脚本,这个脚本有一个引用,这引用指向了一个有着百万整型数据的ScriptableObject,Unity将只在脚本数据中存储对ScriptableObject的引用。ScriptableObject反过来存储数组。对一个ScriptableObject有着一个引用的Prefab,10个Prefab的实例将会占用4MB数据,如另一个例子中所讨论的,总共大约4MB而不是40MB。

使用ScriptableObject的目的是通过避免对值进行复制而减少内存的开销,但是你也可以使用它去定义可插拔的数据集合(pluggable data sets)。一个可想象的例子是,在一个RPG游戏中有一个NPC商店,你可以对你自定义名为ShopContents的ScriptableObject创建多个Asset,每一个asset定义了一系列可购买的条目。在一个总共有三个地区的场景中,每一个地区可能会提供不同层次的条目。你的商店脚本将会引用一个ShopContents的对象,这个对象定义了哪些条目是可用的。

一旦你定义了一个继承自ScriptableObject的类,你可以使用CreateAssetMenu attribute用你的类创建自定义assets。

提示:当在inspector面板中引用了ScriptableObject,你可以双击引用的字段,去为你的ScriptableObject打开inspector面板。你也可以创建一个custom Editor去为你的 ScriptableObject自定义inspector的外观,帮助管理它所代表的数据。

版权声明:本文为CSDN博主「SwordMaster0080」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/SwordMaster8060/article/details/78639915

最新文章