资源管理注意事项 —- meta 文件

本文全文转载自 微信公众号:奎特尔星球,转载前已获得作者授权 作者:ShawnZhang

Cocos Creator 会为 assets 目录下的每一个文件和目录生成一个同名的 meta 文件,相信大家一定不会太陌生。理解 Creator 生成 meta 文件的作用和机理,能帮助您和您的团队解决在多人开发时常会遇到的资源冲突、文件丢失、组件属性丢失等问题。那 meta 文件是做什么用的呢?下面我们来了解一下。

资源管理注意事项 - meta 文件 - 图1

meta 文件的作用

先来看下场景中的 meta 文件长什么样子:

  1. {
  2. "ver": "1.0.0", //版本
  3. "uuid": "911560ae-98b2-4f4f-862f-36b7499f7ce3", //全局唯一id
  4. "asyncLoadAssets": false, //异步加载
  5. "autoReleaseAssets": false, //自动释放资源
  6. "subMetas": {} //子元数据
  7. }

预制件的 meta 文件与场景是一样的。我们再来看一下 png 图片的 meta 文件:

  1. {
  2. "ver": "1.0.0",
  3. "uuid": "19110ebf-4dda-4c90-99d7-34b2aef4d048",
  4. "type": "sprite",
  5. "wrapMode": "clamp",
  6. "filterMode": "bilinear",
  7. "subMetas": {
  8. "img_circular": {
  9. "ver": "1.0.3",
  10. "uuid": "a2d1f885-6c18-4f67-9ad6-97b35f1fcfcf",
  11. "rawTextureUuid": "19110ebf-4dda-4c90-99d7-34b2aef4d048",
  12. "trimType": "auto",
  13. "trimThreshold": 1,
  14. "rotated": false,
  15. "offsetX": 0,
  16. "offsetY": 0,
  17. "trimX": 0,
  18. "trimY": 0,
  19. "width": 100,
  20. "height": 100,
  21. "rawWidth": 100,
  22. "rawHeight": 100,
  23. "borderTop": 0,
  24. "borderBottom": 0,
  25. "borderLeft": 0,
  26. "borderRight": 0,
  27. "subMetas": {}
  28. }
  29. }
  30. }

png 图片的 meta 文件信息比较多,除了基本的 ver 和 uuid 外,还记录了图片的宽高、偏移、九宫格等数据。上面这么多信息,我们这里只关心一个:uuid

uuid : 通用唯一标识符(Universally Unique Identifier)

uuid 是 Creator 用来管理游戏资源的。它会为每个文件分配一个唯一的 id,图集会生成多个。由此可以了解在 Creator 引擎中,识别一个文件不是简单地通过 路径 + 文件名 定位,而是通过 uuid 来引用文件。因此可以在编辑器资源管理中,随意删除、移动文件。

meta 文件更新时机

Creator 生成 meta 文件有以下几种情况:

1、打开工程时

打开项目工程时,Creator 会先扫描 assets 目录,如果哪个文件还没有 meta 文件,此时就会生成。

2、更新资源时

更新资源也会引发 meta 文件的更新:

  • 资源管理器 中可以对资源进行文件名修改、改变目录、删除文件,添加文件等操作,请参考 资源管理器。也可以直接从桌面或操作系统的文件管理器中将文件拖入到 资源管理器 中。

资源管理注意事项 - meta 文件 - 图2

  • 还有一种情况是在操作系统的文件管理器中对 assets 目录中的文件进行增、删、改之后切换到编辑器界面,此时可以看到 资源管理器 刷新的过程。

资源管理注意事项 - meta 文件 - 图3

如果一个文件的 meta 文件不存在,上面两种情况都会触发引擎去生成 meta 文件。

meta 文件出错的几种情况及解决方法

下面我们分析下 meta 文件出错的几种可能情况。

uuid 冲突

uuid 是全局唯一的,产生冲突肯定是有不同的文件的 uuid 相同了,一旦出现这个问题会导致 Cocos Creator 资源管理器目录结构加载不完整。如下图所示,遇到这种情况估计会让你吓出一身冷汗:

资源管理注意事项 - meta 文件 - 图4

从提示中可以看到冲突的 uuid 字符串,然后打开操作系统文件管理或代码编辑器,搜索这个 uuid:

资源管理注意事项 - meta 文件 - 图5

此时先关闭 Creator 编辑器,再任意删除其中一个 meta 文件,然后再打开 Creator 编辑器就可以解决。

这种方法虽然可以解决问题,但在编辑器中引用到这个资源的地方将会出现资源丢失,需要重新编辑或者重新配置一次。最好是通过版本管理工具还原此 meta 文件。

出现这种问题的原因一般有以下两个:

  • 在操作系统的文件管理器中移动文件时,将剪切、粘贴不小心操作成了复制、粘贴,同时也把 meta 文件复制过去了。导致项目中同时出现两个相同的 meta 文件。

  • 在多人协作时,从版本管理工具中,更新资源时碰巧遇到别人生成的 uuid 与你的电脑上某个文件生成的 uuid 一样了,但这种情况非常非常罕见。

总的来说,要减少 uuid 冲突发生,最好在引擎资源管理工具中进行添加、移动文件。

uuid 变化

还有一种情况是 uuid 变了,使得旧的 uuid 对应的资源无法找到,这样的话,你曾经编辑的界面将会出现资源、图片丢失,还可能出现组件属性丢失。

资源管理注意事项 - meta 文件 - 图6

如果找不到旧的 uuid 对应的资源,通过 控制台 可以看到 Creator 给出了所在的场景文件名、节点路径、组件、uuid 等非常详细的警告信息。通过警告信息可以快速定位出错的地方。

这种情况又是怎么造成的呢?当有一个人将新资源添加进项目时,忘记切换到编辑器界面使其生成 meta 文件,同时又将这些新增的文件提交到了版本管理中(不包含 meta 文件)。然后,有另一个人去更新了他所提交的资源,同时切换到了编辑器界面进行编辑,这时 Creator 会检查到新资源没有 meta 文件便会立即生成。而当第一个人切换到编辑器的时候也会生成 meta 文件,这样两个人的电脑上为同一个文件,但是生成的 meta 文件中的 uuid 都不相同。

这种情况下,后面进行资源提交或更新的人,肯定也会遇到冲突,如果不明就理就强行解决冲突,就会产生上面所说的问题。下面的时序图就描述了这种错误的工作流程:

资源管理注意事项 - meta 文件 - 图7

因为第一个 A 同学忘记生成 meta 文件并提交,之后其他人都编辑过项目,但每个人生成的 uuid 都不同,这样就会陷入无限的资源出错中,编辑好的东西,一提交更新又出现冲突了。

要解决这个问题注意下面几点:

  • 提交前检查是否有新增文件,有新增文件时,注意是否有 meta 文件,需要一起提交;

  • 拉取文件时,注意是否有新增文件,并且是有 meta 文件成对,如果没有的话,提醒之前提交文件的同学,把 meta 文件一并提交;

  • 提交时,如果发现只有新增的 meta 文件,那这个 meta 文件肯定是自己生成的,需要注意是否使用过这个 meta 文件对应的资源(同名文件)。如果没用过,那请最早提交者把 meta 文件提交了。千万不能将这个 meta 文件提交上去。

注意上面几点基本上就可以杜绝 meta 文件 uuid 变化导致的工程出错了。

小结

meta 文件是 Creator 用于资源管理的重要手段,但在多人协同开发中稍有不慎就容易产生资源错误。要解决这个问题,不仅需要理解 meta 文件的产生机制和导致冲突的原因,同时还应该规范资源提交流程。