Unity引擎的GUID

  大家好,我是阿赵。
  不知道大家是否遇到过这样的情况:
  在美术同事提交完了一个特效之后,有些人的电脑看,是对的,但有些人的电脑看却是丢图的。
  这样的情况,一般都是因为某个资源的GUID出问题了。

一、什么是GUID

  关于GUID是一个什么东西,可能不少人人都不是很清楚。
  比如我放一张图片到Unity的工程里面:
在这里插入图片描述

  经过了Unity项目的导入之后,会发现在原来的图片旁边,会多出一个和图片同名的meta文件:
在这里插入图片描述

  打开这个meta文件,会看到:
在这里插入图片描述

  其中就有一个guid的项,比如这个文件的guid就是:

d9193987f08db1a49af8b785f3bac6f3

二、 guid是怎样产生的

  从刚才把一张图片放到Unity工程里面的例子,就可以看出,guid是Unity引擎在导入各种资源的时候,自动分配的。那么分配guid是不是有什么算法的呢?比如同一个文件,是不是就永远会分配同一个guid呢?
  这里分几种情况:
1、只删除meta文件
  如果不删除这个图片,只是把图片的meta文件删掉,会发现再次生成出来的meta文件里面的guid是不变的。
2、unity外移动文件
  如果把meta文件删掉,然后把图片在Unity外(比如Windows的资源管理器)移动到别的文件,会发现同一张图片生成的meta文件里面的guid发生了变化
3、 unity内移动文件
在这里插入图片描述

  如果就在Unity内的Project文件浏览里面把文件从一个文件夹拖动到另外一个文件夹,会发现文件的guid是不会发生变化的。
4、 手动修改guid
  比如Unity工程里面已经有2个文件,分别是文件A和文件B。如果手动把文件B的meta文件里面的guid随便改一个位数相同的16进制数字,再保存,是可以修改成功的。
  如果把B文件的meta里面的guid改成位数不对,会报错:

The .meta file xxxx.meta does not have a valid GUID and its
corresponding Asset file will be ignored. If this file is not
malformed, please add a GUID, or delete the .meta file and it will be
recreated correctly

  如果把它改成和文件A一样的guid,会发现在经过Unity导入之后,文件B的guid变化了,和文件A的不一样。如果多次操作,会发现文件B的guid会一直变化。

  这里就可以总结一下,guid实际上是Unity引擎在导入资源的时候生成的,同一个文件生成的guid不是固定的,然后guid是唯一的,不能有2个同样的文件使用同一个相同的guid。

三、 guid的作用是什么

  这里我新建一个材质球,然后把刚才那个图片拖到材质球的一个贴图里面。
在这里插入图片描述

  这个时候,我们可以理解成,这个材质球已经引用了这个贴图。那么究竟材质球是怎样去引用贴图的呢?
  打开这个材质球的mat文件,会发现在_MainTex项里面,会有一个m_Texture,里面的guid,正是刚才我们那张图片的guid。
在这里插入图片描述

  这个时候,如果我把原来那张图片的meta文件里面的guid稍微改一下
在这里插入图片描述

  会发现材质球里面再也不会显示这张贴图了。如果用debug模式去看这个材质球的属性,会发现这时候,图片是missing的。
在这里插入图片描述

  通过这个简单的例子,可以看出来,guid就是文件在Unity引擎里面的唯一标识,也可以说是文件的“身份证”。Unity其实不管文件放在哪个文件夹,在查找资源引用的时候,只会查找guid。如果guid对不上,那么就会造成文件找不到,也就是资源丢失了。

四、 guid在什么时候会出错

  通过上面的说明,估计guid的规则应该已经知道了。正常的情况下,一个资源对应一个meta文件,然后meta文件里面有记录这个文件的guid。在使用文件的时候,只要guid不变,那么资源的引用就不会出错。
  那么所谓的出错,就是文件的guid被错误的修改了,导致造成了找不到资源,也就是资源丢失。
什么情况下容易出现guid错误呢?
1、 svn提交错误
  还是刚才那个例子,如果我提交svn的时候,只提交了材质球的mat文件和图片的png文件,没有提交meta文件。这时候,如果另外一个同事从svn上更新了资源,由于png文件没有对应的meta文件,那么Unity引擎会生成一个新的meta文件。这个新生成的meta文件,里面的guid会和我本地没有提交的meta文件里面的guid不相同。这时候,材质球里面肯定就找不到想要的图片,而表现为missing了。
  可怕的是,在另外一个同事的电脑已经生成了meta文件之后,如果我再把我本地的漏了提交的meta文件提交,这时候可能也解决不了问题。另外一个同事更新的时候,可能会出现2种情况,第一种是svn资源合并了,保留了本地的meta文件的guid。另外一种是svn冲突了。
  如果是svn冲突,可能很好发现,只要解决一下冲突,那资源丢失的问题就解决了。但如果是svn把文件给合并了,只有一个红色的叹号在meta上,这时候其实是需要把本地的meta文件通过svn还原的。但由于红色叹号的含义一般只是代表了修改,很多人并不知道guid其实已经出问题,这时候如果强制提交,那么svn上面的meta文件的guid也会变成错误的了。
所以,在把资源放进Unity引擎项目,然后提交的时候,千万不能漏了meta文件,不然,可能会出现很难发现的资源丢失问题。
2、 重复的meta文件
  有些朋友并不知道meta文件的作用,但却知道meta文件很重要,必须和资源放在一起使用。所以在非Unity环境下(比如Windows资源管理器)复制资源,他们会把资源文件和meta文件一起复制,并且在没有进入Unity引擎导入前,就把复制的文件提交了svn。
  如果在复制完之后,打开一下Unity引擎项目,Unity是会重新导入,并且把相同的guid改掉。由于复制出来的文件对于项目是新文件,所以Unity会保留旧文件的guid,然后把新文件的guid修改掉。这样其实没问题的。
  但因为没有经过Unity的导入,就提交了SVN,这样的情况就导致了svn上面的项目存在2个guid一样的资源。这时候会出现很麻烦的情况。
  如果是新检出的项目,Unity会不知道2个一样的guid哪个是正确的,它会改掉其中一个资源的guid。如果改掉的是你所需要的资源,就会造成正式资源的guid被Unity重新生成导致用到这个资源的其他预设都出现资源丢失。
  更恐怖的是,这时候就算想还原svn,把这个资源的guid改回来都做不到了。因为一个错误的文件占用了它正确的guid,在不删除这个文件之前,你就算还原svn,再进Unity,Unity也会很“固执”的把这个资源的guid再次改掉。除非你知道是哪个文件重复了,把重复的文件删掉,这样才能把正确的文件的guid还原。

五、 检查guid错误

  针对第一种情况,其实很容易解决,发现资源丢失的时候,找资源的制作者问问丢失的事哪个资源,然后去资源所在的文件svn还原一下,一般就可以了。
  针对第二种情况,问题集中在怎样找到哪里有重复的guid的资源,所以可以做一个工具来查询guid对应的资源:
在这里插入图片描述

  代码很简单,就这样:

string path = AssetDatabase.GUIDToAssetPath(guidStr);
Object obj = AssetDatabase.LoadAssetAtPath<Object>(path);

  当出现了怎样还原svn, guid都还在变的时候,就先还原svn,不要进Unity,把guid记下来,然后到Unity引擎里面,查找这个guid,看看是哪个资源占用了guid,最后把占用了guid的错误资源删掉就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值