unity游戏框架学习-资源管理

概述:https://www.cnblogs.com/wang-jin-fu/p/10975660.html

这篇只涉及基础原理,下篇会讲如何实现一个简单的资源管理框架。

一、Assets和Objects

资源(Asset)是存储在Unity项目的 Assets 文件夹中的磁盘文件。有些资源的数据格式是Unity原声支持的,有些资源则需要转换为源生的数据格式后才能被使用。
对象(UnityEngine.Object),代表序列化数据的集合,表示某个资源的具体实例。它可以是Unity使用的任何类型的资源,所有对象都是UnityEngine.Object基类的子类
一个资源可以包含多个对象(一对多)
二、文件GUID、fileID(本地ID)、InstanceID(实例ID)

Unity文件、文件引用、Meta详解:https://blog.uwa4d.com/archives/USparkle_inf_UnityEngine.html

meta文件:Unity在首次将Asset导入Unity时会生成meta文件,它与Asset存储在同一个目录中。该文件中记录了资源的GUID和fileID(本地ID),文件GUID(File GUID)标识了资源文件(Asset file)在哪个目标资源(target resource)文件里,fileID(本地ID)用于标识Asset中的每个Object。资源间的依赖关系通过GUID来确定;资源内部的依赖关系使用fileID来确定,每个fileID对应一组组件信息,该信息记录了其对应组件的类型及初始化信息。例如以下示例m_Script记录脚本的guid,其他参数为m_Script的类初始化时的参数

--- !u!114 &114826744576399670
MonoBehaviour:
  m_ObjectHideFlags: 1
  m_PrefabParentObject: {fileID: 0}
  m_PrefabInternal: {fileID: 100100000}
  m_GameObject: {fileID: 1151505213129540}
  m_Enabled: 1
  m_EditorHideFlags: 0
  m_Script: {fileID: 11500000, guid: 48fb9c66a154844a495af53fc97a7656, type: 3}
  m_Name: 
  m_EditorClassIdentifier: 
  m_Material: {fileID: 0}
  m_Color: {r: 1, g: 1, b: 1, a: 1}
  m_RaycastTarget: 0
  m_OnCullStateChanged:
    m_PersistentCalls:
      m_Calls: []
    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
  m_Sprite: {fileID: 21300000, guid: 5c7a7d69156d06448833b25308c032cf, type: 3}
  m_Type: 0
  m_PreserveAspect: 0
  m_FillCenter: 1
  m_FillMethod: 4
  m_FillAmount: 1
  m_FillClockwise: 1
  m_FillOrigin: 0
  m_SpriteName: 
  m_isNativeSize: 0
  m_isGradualMat: 0
除了GUID,meta文件还存储了有关资源导入的信息。例如,贴图资源在导入时可以当作标准贴图、法线贴图、GUI贴图、cookie或者光线贴图。这些导入设置都会被存储在meta文件里。
 
我们以预制体Close作为示例,它包含一个Image的图片子节点,一个BtnClose的按钮节点
.meta文件大概是这样子的:guid是指Asset的id,这个id是唯一的,通过Library\metadata下保存的导入信息可以索引到Asset路径
fileFormatVersion: 2
guid: 9070bffdf4e7444e190533a128133eb4
timeCreated: 1519804963
licenseType: Pro
NativeFormatImporter:
  mainObjectFileID: 100100000
  userData: 
  assetBundleName: 
  assetBundleVariant: 

 Library\metadata下的文件和Close.Prefabs大概是这样子的:

如上,Close预制体包含了三个GameObject(Close、Image、BtnClose),在文件导入的时候,unity为每个文件生成一个导出配置,该配置存储在项目的Library\metadata\xx文件夹里,其中xx为.meta记录的guid的前两位,例如70a2579b07749524b8c15f66a4c7216f,对应的xx为70,这个配置保存了GUID和path的对应关系,该ath会指向你的资源目录,只要GUID没变,unity就能索引到资源的目录。该配置还保存了预制体内三个对象的fileID(本地ID),他与上图右侧的Close.Prefabs文件记录的GameObject是一致的。

我们再来看看Close.Prefabs这个文件,每一个Unity对象都会有一个FileID,然后在需要引用时,使用这些FileID即可。

以Image对象为例子。Image对象拥有三个组件,RectTransform、CanvasRenderer、MonoBehaviour(对应的ImageEx组件,该组件继承自Image),你可以在unity里查看对象的fileID

每一个组件的数据基本上就是这个组件的一堆参数了。那怎么区分这个组件是什么类型的呢?MonoBehaviour的类型参考https://docs.unity3d.com/Manual/ClassIDReference.html YAML数据,例如--- !u!222 &222167935205389516的222对应的是CanvasRenderer这个组件,用户自定义的组件通过m_Script参数的guid定位到对应的c#文件目录,就能识别出这个具体是什么类了

如下,114826744576399670(ImageEx)的组件信息里记录了ImageEx文件的guid,以及ImageEx的初始化信息,实例化这个对象时,unity通过这guid找到imageEx这个类的文件并实例化,再将初始化参数赋值给实例化的对象

所以在实例化一个GameObject时,只要依照次序,依次创建物体,组件,初始化数据并进行引用绑定即可在场景中生成一个实例。

 

InstanceID:Unity为了在运行时,提升资源管理的效率,会在内部维护一个缓存表,负责将文件的GUID与fileID转换成为整数数值,这个数值在本次会话中是
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值