CocosCreator会为assets目录下的每一个文件和目录生成一个同名的meta文件,相信大家一定不会太陌生,那meta文件是作什么用的呢?这次我们就来说下meta,理解了CocosCreator生成meta文件的作用和机理,能帮助你和你的团队解决在多人开发时常会遇到的资源冲突、文件丢失、组件属性丢失等问题。
先看下场景文件的meta长什么样子:
{
"ver": "1.0.0", //版本
"uuid": "911560ae-98b2-4f4f-862f-36b7499f7ce3", //全局唯一id
"asyncLoadAssets": false, //异步加载
"autoReleaseAssets": false, //自动释放资源
"subMetas": {} //子元数据
}
场景与预制件的meta都长的一个样,再看一个png图片的:
{
"ver": "1.0.0",
"uuid": "19110ebf-4dda-4c90-99d7-34b2aef4d048",
"type": "sprite",
"wrapMode": "clamp",
"filterMode": "bilinear",
"subMetas": {
"img_circular": {
"ver": "1.0.3",
"uuid": "a2d1f885-6c18-4f67-9ad6-97b35f1fcfcf",
"rawTextureUuid": "19110ebf-4dda-4c90-99d7-34b2aef4d048",
"trimType": "auto",
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 0,
"trimY": 0,
"width": 100,
"height": 100,
"rawWidth": 100,
"rawHeight": 100,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"subMetas": {}
}
}
}
图片文件meta信息比较多,除了基本的ver和uuid外,还记录了图片的高宽、偏移、九宫格等数据。上面这么多信息,我们这里只关心一个:uuid
uuid: 通用唯一标识符(Universally Unique Identifier)
uuid是CocosCreator用来管理游戏资源用的,它会为每个文件分配一个唯一的id。由此可以了解到在CocosCreator引擎中,识别一个文件不是简单地通过路径+文件名。因此在引擎中,随便修改文件名、目录都是可以的(仅能在引擎的,资源管理器中做修改)。
CocosCreator生成meta文件有以下几种情况:
引擎在工程刚被打开时,先扫描assets目录,如果哪个文件还没有meta文件,此时就会生成。
####更新资源时
更新资源也引发meta文件的更新:
2. 还有一种情况是在操作系统的文件管理器中对assets目录中的文件进行增、删、改之后,激活引擎编辑器窗口,此时可以看到资源管理器刷新的过程。
如果资源的meta文件不存在,上面两种情况都有会触发引擎去生成meta文件。
下面我们分析下meta文件出错的几种可能情况。
uuid是全局唯一的,产生冲突肯定是有不同文件的uuid相同了,一旦出现这个问题会导致CocosCreator资源管理器目录结构加载不完整,看下图,遇到这种情况估计会让你吓出一身冷汗:
从提示中可以看到冲突的uuid字符串,打开操作系统文件管理或代码编辑器,搜索这个uuid:
这时先关闭CocosCreator,然后再任意删除其中一个meta文件,再打开CocosCreator问题可以解决。
这种方法虽然可以解决问题,但如果在编辑器中曾经引用过这个资源的地方将会出现资源丢失,你需要重新编辑或配置一次。最好是通过版本管理工具还原此meta文件。
据我观察,出现这种问题的原因有两个:
总的来说,要解少uuid冲突发生,最好在引擎资源管理工具中进行添加、移动文件。
还有种情况是uuid变了,你曾经编辑的界面将会出现资源、图片丢失,还可能出现组件属性丢失。
通过Creator控制台警告可以看到,有曾经被使用过的资源uuid,但现在丢失了。提示还是很详细的,给出了所在的场景文件名、节点路径、组件、uuid,通过提示可以快速定位资源丢失的地方。
这种情况又是怎么造成的呢?一种情景是在新资源添加进项目时,忘记了激活一下CocosCreator让其生成meta文件,同时又将这些新增的文件提交到了版本管理中(不包含meta文件)。之后,有同学去更新了他提交的资源,同时打开或激活了CocosCreator进行编辑,这时Creator会检查到新资源没有meta便会立即生成。这样两个同学的电脑上为同一个文件,生成的meta文件中的uuid都不相同。
这种情况下,后面进行资源提交或更新的同学,肯定也会遇到冲突,如果不明就理就强行解决冲突,就会产生上面的问题,同时把问题蔓延到别的人身上,下面的时序图,描述了这种错误的工作流程:
上面就因第一个A同学忘记生成meta并提交,导致这个严重的问题,每个人都编辑过项目,但每个人生成的uuid都不同。如果不明其理,会陷入无限的资源出错中,做好的东西,一更新提交又出问题。
要解决这个问题注意下面几点:
注意上面几点基本上就可以杜绝meta文件uuid变化导致的工程出错了。
meta文件是CocosCreator用于资源管理的重要手段,但在多人协同开发中稍有不慎就容易产生资资源错误。要解决这个问题,不仅需要理解meta文件的产生机制和导致冲突的原因,同时还应该规范资源提交流程。