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 神一般的狄狄