0.前言
看到一篇关于Unity资源加载入门文章(ps.内容很好),虽然我也算是个资深U3D程序了,但是,还从来没有仔细想过加载资源方面的实现原理。最近刚看完《3D游戏编程大师技巧》,借鉴对书中内容的理解,举一反三分析一下U3D的资源加载。
1.《3D游戏编程大师技巧》资源加载总结
- 1.首先,资源就是存在硬盘上的文件。文件类型,可以是.fbx .obj (模型文件),.midi .mp3 (声音文件),可以是自定义的文件类型
- 2.将资源加载到内存中之后,需要对资源的格式进行解析,创建对象实例,给对象实例赋值
- 3.资源的信息存储到了对象实例之后,资源文件其实就没有用了。这个时候,可以选择将资源从内存中释放掉,或者,向U3D加载AssetBundle那样,存在内存中,以方便以后再创建这个资源的实例对象。
要创建资源的实例,并将信息记录到实例中,那么就需要知道资源的格式。
要知道,各种类型的资源其实没什么神秘的敌方,其实就是信息组织的方式不同而已,相对应的,解析的方式也是不同的。
举个例子,.PLG文件的格式是:
- 物体名称 顶点数 多边形数
- 顶点列表
(按0到n的顺序排列。每个顶点的坐标之间用空格隔开:x y z) - 多边形列表
(每行描述一个多边形的颜色、顶点数、顶点的索引号:描述符 顶点数 顶点(逆时针方向排列)v1 v2 v3 … vn)
pyramid 5 5 // 模型名字是 pyramid 有5个顶点,5个面
0 20 0 // 第1个顶点,坐标(0,20,0) 顶点index=0
30 -10 30 // 第2个顶点 顶点index=1
30 -10 -30 // 第3个顶点 顶点index=2
-30 -10 -30 // 第4个顶点 顶点index=3
-30 -10 30 // 第5个顶点 顶点index=4
10 3 0 2 1 // 第1个多边形 描述符是10 3个顶点,顶点的index分别是0,2,1
10 3 0 3 2 // 第2个多边形
10 3 0 4 3 // 第3个多边形
10 3 0 1 4 // 第4个多边形
10 4 1 2 3 4 // 第5个多边形
因此,类推到U3D的资源加载方式中,如果能够知道所加载文件的信息组织方式,那么加载使用什么的,也就不神秘了。
2.U3D资源加载总结
总结Unity资源加载入门中提到的文件格式(U3D自定义的文件格式):
- 1.meta文件
.fbx .jpg .png等其他地方也通用的文件,之外U3d自定义的.meta文件用于记录文件的其他信息,可以理解为配置信息
不同资源的.meta文件内容不一样,稍微列举一些
fileFormatVersion: 2
guid: 620945c7971b94e4c98fb93f29a7526e // 资源的唯一标识
timeCreateed: xxxx // 创建时间
MonoImporter: // 脚本
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
folderAsset: yes // 文件夹(文件夹才有的类型)
guid是标识资源的唯一id。文件夹、脚本什么的,也都是资源,都有.meta文件。
如果是模型资源的.meta文件,里面有存储模型的导入信息、动作信息等。导入模型的不同配置都在模型的.meta文件中。U3D中只能修改模型的配置文件,模型资源其实是没有修改的。
同理,其他文件比如图片什么的,配置文件也都在.meta文件中记录
2.*.Prefab
这是U3D自定义的资源
这个资源中记录了这个Prefab中所使用到的GameObject的信息,以及这个GameObject上有什么Component、Layer、tags、name、icon等等以及一个唯一标识文件内部各对象之间的关系——Local ID3 真实的由资源创建的对象实例,会通过InstanceID唯一标识
4.UnityEditor会维护创建一张映射表,记录了File GUID、Local ID 和Instance ID之间的关系。用于请求资源的快速查找。(AssetDatabase类中提供了查找文件资源、prejfab资源、实例资源的各种方法)
5.AssetBundle资源中存储了通用格式资源的压缩文件(也可能不压缩),和与其他引用到的资源的信息
3.总结
总之,游戏中的东西都不是凭空出现的。所有东西都记录到文件里面。文件也就是资源。游戏过程中将资源的信息加载到内存中。
以上。