本章介绍Unity的序列化系统的深层内部,以及Unity如何在Unity Editor和运行时维护不同对象之间的健壮引用。它还讨论了对象和资产之间的技术区别。这里涉及的主题是理解如何在Unity中有效加载和卸载资产的基础。正确的资产管理对于缩短加载时间和降低内存使用率至关重要。
1.1。内部资产和对象
要了解如何在Unity中正确管理数据,了解Unity如何识别和序列化数据非常重要。第一个关键点是Assets和UnityEngine.Objects之间的区别。
一个资产是磁盘上的文件,存储在资产为Unity项目的文件夹中。纹理,3D模型或音频剪辑是常见的资产类型。某些资产包含Unity原生格式的数据,例如材料。其他资产需要处理为本机格式,例如FBX文件。
甲UnityEngine.Object,或对象以大写“O”,是一组序列化的数据统称为描述资源的特定实例的。这可以是Unity Engine使用的任何类型的资源,例如网格,精灵,AudioClip或AnimationClip。所有对象都是UnityEngine.Object基类的子类。
虽然大多数对象类型都是内置的,但有两种特殊类型。
-
一个个ScriptableObject提供了一个方便的系统开发人员可以定义自己的数据类型。Unity可以对这些类型进行本机序列化和反序列化,并在Unity Editor的Inspector窗口中进行操作。
-
一个MonoBehaviour提供链接到一个包装MonoScript。MonoScript是一种内部数据类型,Unity用于保存对特定程序集和命名空间内特定脚本类的引用。该MonoScript并没有包含任何实际的可执行代码。
资产和对象之间存在一对多的关系; 也就是说,任何给定的Asset文件都包含一个或多个Objects。
1.2。对象间引用
所有UnityEngine.Objects都可以引用其他UnityEngine.Objects。这些其他对象可以驻留在同一资产文件中,也可以从其他资产文件导入。例如,材质Object通常具有一个或多个对纹理对象的引用。这些纹理对象通常从一个或多个纹理资源文件(例如PNG或JPG)导入。
序列化时,这些引用由两个单独的数据组成:文件GUID和本地ID。文件GUID标识存储目标资源的资产文件。一个本地唯一(1)本地ID标识资产文件中的每个对象,因为资产文件可能包含多个对象。
文件GUID存储在.meta文件中。这些.meta文件是在Unity首次导入资产时生成的,并存储在与资产相同的目录中。
可以在文本编辑器中查看上述标识和引用系统:创建一个新的Unity项目并更改其编辑器设置以公开可见元文件并将资产序列化为文本。创建材质并将纹理导入到项目中。将材质指定给场景中的立方体并保存场景。
使用文本编辑器打开与材料关联的.meta文件。标有“guid”的行将出现在文件顶部附近。此行定义材料Asset的文件GUID。要查找本地ID,请在文本编辑器中打开材料文件。材质Object的定义如下所示:
---!u!21&2100000
材料:
serializedVersion:3
......更多数据.....