找回密码
 立即注册
查看: 324|回复: 0

浅谈Unity资源系统(一)

[复制链接]
发表于 2023-3-28 09:39 | 显示全部楼层 |阅读模式
> 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、一些常见的资源管理方案、一些资源相关的优化手段(包体、内存、读取、工作流),欢迎关注我和我的专栏。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-16 21:39 , Processed in 0.102333 second(s), 28 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表