浅谈Unity的Meta文件作用和prefab等文件文本内容解析

Unity里的所有文件都是文本格式,可以看到内容。

Meta文件格式:(不同文件,可能第三行开始内容会不同)

fileFormatVersion: 2
guid: 8c37735a974bb7f4a8fa831a31dff02a
PrefabImporter:
  externalObjects: {}
  userData: 
  assetBundleName: 
  assetBundleVariant:

文件导入unity之后,会自动生成meta文件。
Meta文件主要记录内容是 GUID 和 文件导入设置

1.GUID:
guid: 8c37735a974bb7f4a8fa831a31dff02a 是在整个工程里的唯一ID,导入即分配,不会出现重复。
如果出现重复,会出现黄色警告:
测试方法:新建一个材质名字为m1,同时unity会生成对应的m1.mat.meta。
打开这个文件所在路径,在文件夹下,选中m1和它的meta,复制。
然后打开unity等待自动导入后,会出现黄色警告: 在这里插入图片描述
提示,不要在unity引擎之外进行文件移动或者删除操作。
实际上,unity会对时间相对较晚导入的错误meta文件重新分配guid(有时候不分配,保持meta文件冲突的状态,也不会再次警告,不知道为啥)。冲突导致的问题,后续会说到。

2:导入设置
测试方法:icon导入unity后,切换到sprite模式。提交svn。后修改MaxSize 32.
可以看到变化 尺寸被修改, 从2048改到32. 红框部分是可发布平台。可以单独修改。
在这里插入图片描述

Unity里文件之间的连接关系:

测试: 现在有一个材质,一张图片,图片挂在了材质上:
在这里插入图片描述
如图,m1材质上有一张icon37 在这里插入图片描述
保存后可以看到m1.mat有修改。 在这里插入图片描述
比较差异可以发现一行内容修改。
- _MainTex:
m_Texture: {fileID: 0}
改成了
- _MainTex:
m_Texture: {fileID: 2800000, guid: 336f4b4eab0aaef4a882d98f5ae39ec0, type: 3}

打开icon37的meta文件可以看到
在这里插入图片描述
guid: 336f4b4eab0aaef4a882d98f5ae39ec0
会发现图片的GUID和材质文件里修改内容的GUID一样。
所以unity内文件之间的依赖引用关联,是用GUID来进行的。
如果出现了meta文件冲突,那么文件记录的GUID,就可能不是原来选中的文件。就会出现文件丢失。

测试:
guid: 336f4b4eab0aaef4a882d98f5ae39ec1
我把图片GUID最后一位数 从0改成1.
进入unity后发现
在这里插入图片描述
材质上的图片丢失。
同理存在于unity内各种文件关联:
我把一个脚本挂在一个GameObject上, 修改了脚本的meta文件GUID
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
报错形式各不相同。出现missing字样,基本都是GUID出问题了。

Unity的文件保存

Unity里所有文件都是文本文件,
所以如果我对一个对象的坐标修改会实际反映在文件内容上。
在这里插入图片描述
我把一个prefab的坐标从000 改成了 9.87
在这里插入图片描述
对比差异,可以看到坐标被修改,可以看到修改的字段名字叫m_LocalPosition
它的父节点是Transform, 对应了unity里面板上Transform组件的position。

包括自定义脚本上的参数,都会在面板上表现。
我把一个脚本挂载到节点上,查看差异: 在这里插入图片描述
在这里插入图片描述
发现了2处修改。
component: {fileID: -2879555396794527001} 说明了,这个对象上新增了一个引用GUID是这一串287955….。 具体引用了什么,在下面这段里面加了说明:

最重要的几行内容:

第83行 — !u!114 &-2879555396794527001
— !u!114是当前这篇文本里的唯一ID
-2879555396794527001 标记上面的引用

第84行 MonoBehaviour:
说明这个这个引用 是一个自定义脚本。 自定义脚本在unity的类型都是MonoBehaviour

第92行 m_Script: {fileID: 11500000, guid: 5779c70bde44e2542abf571ef9a2b611, type: 3}
GUID在这里,GUID除了确保文件的唯一性,确定文件之间关联,还会标记这个脚本所在的目录
(所以前文里面说到的,警告:提示,不要在unity引擎之外进行文件移动或者删除操作。 在unity内部进行文件路径移动操作,unity会重新记录GUID所在目录,而GUID不会发生变化)

第94行:m_EditorClassIdentifier:
这行开始往下,都是这个自定义脚本上的参数,比如我的脚本上暴露了一个槽位,名字叫做a
在这里插入图片描述
那么在文本中95行也会体现出a:0
我在unity里进行修改
在这里插入图片描述

A值改为567
在这里插入图片描述
可以看到文本里也被修改了。

总结:
1.大量修改,为了节约工时,可以忽略文本内容。
但是小部分修改,或者参数修改,在提交SVN前,应该,对比当前版本差异,看自己是不是有多余操作或者误操作。把误操作上传,会导致各种问题,重新调试,费时费力。
2.为什么需要了解unity文件保存格式和原理:
你以为自己在引擎里做了12345件事,但这个操作真的有效?引擎真的知道么?文件的保存(序列化和反序列化)才是真正体现操作的本身。


上文中的使用的是SVN+Beyond Compare进行的操作
有操作不明白,可以私聊,留言,qq联系

程序学无止尽。
欢迎大家沟通,有啥不明确的,或者不对的,也可以和我私聊
我的QQ 334524067 神一般的狄狄

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值