cocoscreator meta的冲突解决

2020-09-05  本文已影响0人  Pilihou

CocosCreator会为assets目录下的每一个文件和目录生成一个同名的meta文件,相信大家一定不会太陌生,那meta文件是作什么用的呢?这次我们就来说下meta,理解了CocosCreator生成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是CocosCreator用来管理游戏资源的,它会为每个文件分配一个唯一的id,图集会生成多个。由此可以了解在CocosCreator引擎中,识别一个文件不是简单地通过路径+文件名定位,而是通过uuid来引用文件。因此可以在编辑器资源管理中,随意删除、移动文件。

2. meta文件更新时机

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

打开工程时

CocosCreator引擎在工程刚被打开时,先扫描assets目录,如果哪个文件还没有meta文件,此时就会生成。

更新资源时

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

  1. 通过引擎编辑器资源管理窗口,可以对资源进行文件名修改、改变目录、删除文件,添加文件可以从桌面或操作系统的文件管理器将文件拖入引擎资源管理器中。
拖动图片到资源管理器
  1. 还有一种情况是在操作系统的文件管理器中对assets目录中的文件进行增、删、改之后,激活引擎编辑器窗口,此时可以看到资源管理器刷新的过程。
资源刷新

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

3. 分析meta文件出错的几种情况及解决办法

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

uuid冲突

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


CocosCreator UUID冲突

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

搜索uuid,找到两个相同的

这时先关闭CocosCreator,然后再任意删除其中一个meta文件,再打开CocosCreator问题可以解决。

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

据我观察,出现这种问题的原因有两个:

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

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

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

uuid变化

还有种情况是uuid变了,你曾经编辑的界面将会出现资源、图片丢失,还可能出现组件属性丢失。


uuid变化,编辑器资源丢失

通过Creator控制台的警告可以看到,有曾经被使用过的资源uuid,但现在丢失了。提示还是很详细的,给出了所在的场景文件名、节点路径、组件、uuid,通过提示可以快速定位资源丢失的地方。

这种情况又是怎么造成的呢?一种情景是在新资源添加进项目时,忘记了激活一下CocosCreator让其生成meta文件,同时又将这些新增的文件提交到了版本管理中(不包含meta文件)。之后,有同学去更新了他提交的资源,同时打开或激活了CocosCreator进行编辑,这时Creator会检查到新资源没有meta便会立即生成。这样两个同学的电脑上为同一个文件,生成的meta文件中的uuid都不相同。

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


资源更新流程

上面就因第一个A同学忘记生成meta并提交,导致这个严重的问题,每个人都编辑过项目,但每个人生成的uuid都不同。如果不明其理,会陷入无限的资源出错中,做好的东西,一提交更新又出问题了。

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

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

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

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

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

4. 小结

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

上一篇下一篇

猜你喜欢

热点阅读