垃圾佬 发表于 2023-3-28 09:39

浅谈Unity资源系统(一)

> Unity的资源系统是一个非常广的话题,本章只会讲以下主题

[*]什么是Asset?Unity的资源是如何管理的?
[*]什么是Object(UnityEngine.Object)?
[*]Unity几种常见的"ID"
一,Asset

一般指Unity可识别的资源文件。每个资源文件会跟着一个同名的meta文件。Import后暂存在Library/metadata文件夹中(大项目importing的时间经常很长~~摸鱼利器~~效率降低的罪魁祸首)。1. Native Asset


[*]可以直接识别的资源文件,不需要import
[*]使用NativeFormatImporter导入
[*]代表:.prefab、.mat
2. Non-Native Asset


[*]需要import导入
[*]使用meta文件中定义的Importer,如DefaultImporter、TextureImporter、ModelImporter等
[*]代表:.png、.fbx
二,什么是Object(UnityEngine.Object)?


[*]UnityEngine.Object是Unity能够实例化的最小单位。
[*]UnityEngine.Object是序列化了的实例。本质上UnityEngine.Object不一定是实际的游戏运行时实例,需要经过Instantiate,才会把实际数据加载到内存中。
[*]Asset和Object存在一对多的关系,任何给定的资源文件都包含一个或多个对象。
[*]ScriptableObject是Object但不是MonoBehavior。是可以自定义的数据资源文件。也就是说这个是和Sprite、Texture2D同级别的概念。
[*]注意:卸载资源(无论是Resource还是AB)后才能消除引用,最终资源和Wrapper内存才能被释放

三,File ID、Local ID、Instance ID


[*]File ID
[*]是资源文件的全局唯一标识
[*]是一个guid.(什么是GUID: https://zh.wikipedia.org/zh-cn/%E5%85%A8%E5%B1%80%E5%94%AF%E4%B8%80%E6%A0%87%E8%AF%86%E7%AC%A6)
[*]资源互相引用时使用它
[*]存放在meta文件中,如图




guid/file id


[*]Local ID
[*]是Object在Asset中的唯一标识符(但在其他Asset中会重复,且常常会重复)
[*]Asset GUID + Object LocalID可以唯一标识游戏中的Object。这两个标识可以认为是可靠的(太倒霉除外)
[*]在Asset中,"&"后面跟的一般就是LocalID




Local ID


[*]Instance ID
[*]是Object基类的方法,用于限定情况下的"唯一"标识
[*]性能较高。(毕竟guid还是蛮大的,128位)
[*]是运行时分配和销毁的。如果动态加载或卸载AssetBundle,Unity会生成或删除为其分配的InstanceID。所以,重新载入同一个AB包,获得的InstanceID不可保证相同。
[*]谨慎使用,可能会导致Editor下不复现但Runtime下出现的bug(踩过坑的请举手)

关于Unity的资源系统其实有很多可以聊的,但无论如何,这些内容都是了解拓展方案的基础。后面我准备聊聊AB、AA、一些常见的资源管理方案、一些资源相关的优化手段(包体、内存、读取、工作流),欢迎关注我和我的专栏。
页: [1]
查看完整版本: 浅谈Unity资源系统(一)