Creator实用教程:你真的了解meta吗?
The following article is from 奎特尔星球 Author 张晓衡
来源:公众号(奎特尔星球)
作者: ShawnZhang
版权归原作者所有!
Cocos 已获得作者转载授权
《CocosCreator 基础教程—— meta 的秘密》
Cocos Creator 会为 assets 目录下的每一个文件和目录生成一个同名的 meta 文件,相信大家一定不会太陌生。那 meta 文件是作什么用的呢?这次我们就来说下 meta,理解了 Cocos Creator 生成 meta 文件的作用和机理,能帮助你和你的团队解决在多人开发时常会遇到的资源冲突、文件丢失、组件属性丢失等问题。
脚本丢失
1.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 是 Cocos Creator 用来管理游戏资源的。它会为每个文件分配一个唯一的 id,图集会生成多个。由此可以了解在 Cocos Creator 引擎中,识别一个文件不是简单地通过路径+文件名定位,而是通过 uuid 来引用文件。因此可以在编辑器资源管理中,随意删除、移动文件。
2. meta文件更新时机
Cocos Creator 生成 meta 文件有以下几种情况:
打开工程时
Cocos Creator 引擎在工程刚被打开时,先扫描 assets 目录,如果哪个文件还没有 meta 文件,此时就会生成。
更新资源时
更新资源也会引发 meta 文件的更新:
(1)通过引擎编辑器资源管理窗口,可以对资源进行文件名修改、改变目录、删除文件,添加文件可以从桌面或操作系统的文件管理器将文件拖入引擎资源管理器中。
拖动图片到资源管理器
(2)还有一种情况是在操作系统的文件管理器中对assets目录中的文件进行增、删、改之后,激活引擎编辑器窗口,此时可以看到资源管理器刷新的过程。
资源刷新
如果一个文件的 meta 文件不存在,上面两种情况都会触发引擎去生成 meta 文件。
3. 分析 meta 文件出错的几种情况及解决办法
下面我们分析下 meta 文件出错的几种可能情况。
uuid冲突
uuid 是全局唯一的,产生冲突肯定是有不同的文件的 uuid 相同了,一旦出现这个问题会导致 Cocos Creator 资源管理器目录结构加载不完整,看下图,遇到这种情况估计会让你吓出一身冷汗:
Cocos Creator UUID冲突
从提示中可以看到冲突的 uuid 字符串,打开操作系统文件管理或代码编辑器,搜索这个 uuid:
搜索uuid,找到两个相同的
这时先关闭 CocosCreator ,然后再任意删除其中一个 meta 文件,再打开 Cocos Creator 问题可以解决。
这种方法虽然可以解决问题,但如果在编辑器中曾经引用过这个资源的地方将会出现资源丢失,你需要重新编辑或配置一次。最好是通过版本管理工具还原此 meta 文件。
据我观察,出现这种问题的原因有两个:
(1)在操作系统的文件管理器中移动文件时,将剪切、粘贴操作不少心弄成了复制、粘贴,同时也把meta文件也复制过去了。导致项目中同时出现两个相同的meta文件。
(2)在多人协作时,从版本管理工具中,更新资源时碰巧遇到别人生成的uuid与你的电脑上某个文件生成的uuid一样了,但这种情况非常、非常的罕见。
总的来说,要解少 uuid 冲突发生,最好在引擎资源管理工具中进行添加、移动文件。
uuid变化
还有种情况是 uuid 变了,你曾经编辑的界面将会出现资源、图片丢失,还可能出现组件属性丢失。
uuid变化,编辑器资源丢失
通过 Creator 控制台的警告可以看到,有曾经被使用过的资源 uuid ,但现在丢失了。提示还是很详细的,给出了所在的场景文件名、节点路径、组件、uuid,通过提示可以快速定位资源丢失的地方。
这种情况又是怎么造成的呢?一种情景是在新资源添加进项目时,忘记了激活一下 Cocos Creator 让其生成 meta 文件,同时又将这些新增的文件提交到了版本管理中(不包含 meta 文件)。之后,有同学去更新了他提交的资源,同时打开或激活了 Cocos Creator 进行编辑,这时 Creator 会检查到新资源没有 meta 便会立即生成。这样两个同学的电脑上为同一个文件,生成的 meta 文件中的 uuid 都不相同。
这种情况下,后面进行资源提交或更新的同学,肯定也会遇到冲突,如果不明就理就强行解决冲突,就会产生上面的问题,同时把问题蔓延到别的人身上。下面时序图,描述了这种错误的工作流程:
资源更新流程
上面就因第一个 A 同学忘记生成 meta 并提交,导致这个严重的问题,每个人都编辑过项目,但每个人生成的 uuid 都不同。如果不明其理,会陷入无限的资源出错中,做好的东西,一提交更新又出问题了。
要解决这个问题注意下面几点:
()提交前检查是否有新增文件,有新增文件时,注意是否有 meta 文件,需要一起提交;
(2)拉取文件时,注意是否有新增文件,并且是有 meta 文件成对,如果没有提醒之前提交文件的同学,把 meta 文件一并提交;
(3)提交时,如果发现只有新增的 meta 文件,那这个 meta 文件肯定是自己生成的,那注意是否使用过这个 meta 文件对应的资源(同名文件)。如果没用过,那请这个文件最早提交者把 meta 文件提交了。千万不能将这个 meta 文件提交上去。
注意上面几点基本上就可以杜绝 meta 文件 uuid 变化导致的工程出错了。
4. 小结
meta 文件是 Cocos Creator 用于资源管理的重要手段,但在多人协同开发中稍有不慎就容易产生资资源错误。要解决这个问题,不仅需要理解 meta 文件的产生机制和导致冲突的原因,同时还应该规范资源提交流程。
<转载结束>
「奎特尔星球」微信公众号,分享 Cocos Creator 游戏开发相关技术、经验以及奇幻故事教程,欢迎感兴趣的开发者关注。Cocos 在此也诚邀各路技术大神,不吝分享,多多在 Cocos 技术论坛中交流探讨哟!