本文将从Unity编辑器和运行时两个角度出发,主要探讨以下两方面内容:Unity序列化系统内部细节以及Unity如何维护不同对象之间的强引用。另外还会讨论对象与资源的技术实现差别。
译注:除非特别说明,下文中所有的“资源”均指代“Asset”。
本文内容是理解在Unity中如何高效加载和卸载资源的基础。正确的资源管理对缩短加载时间并减少内存占用来说至关重要。今天先为大家分享上半部分内容。
1.1. 深入理解资源和对象
在理解Unity如何确保万无一失地管理数据之前,首先要知道Unity是如何识别并序列化数据的。首先第一点,要正确区分资源(Asset)和对象(UnityEngine.Objects)。
Asset
资源(Asset)是硬盘中的文件,存储在Unity工程的Assets文件夹内。例如,纹理(Texture),材质(Material)和FBX文件等,它们都是资源。一些资源的数据格式是Unity原生支持的,例如材质。有些资源则需要转换为原生的数据格式后才能被Unity使用,例如FBX文件。
UnityEngine.Object
UnityEngine.Object,或者说以大写字母O开头的Object——对象,代表序列化数据的集合,表示某个资源的具体实例。它可以是Unity引擎使用的任何类型的资源,例如网格,Sprite,音频剪辑或动画剪辑。所有的对象(Object)都是UnityEngine.Object基类的子类。
特殊的Object类型
几乎所有的对象(Object)类型都是内建的,其中有两种比较特殊的类型。
MonoScript的容器。MonoScript是一种内部数据类型,Unity用它保存对某个特定程序集和命名