Unity GUID

Unity GUID


前言

最近在工作中遇到了项目中分批次打的AB包做热更新时出现丢图的问题,后来逐步定位到图集的guid发生变化了。在此正好总结一下Unity的guid相关的内容。


概念

guid是资源的唯一标识符,Unity用它来记录资源之间的引用关系。

local id/file id是资源内部的id,Unity用它来记录资源内部的具体引用/层级关系。

一般来说,guid和local id是成对使用的,Unity需要同时使用这两种id去查找一个资源。但由于每次需要以全部资源为检索源,数量非常多,查找开销也会大。于是为了加快查找,Unity给已加载的资源生成了一个instance id。

instance id是资源的快捷访问id(一种自增的id),Unity查找资源的时候会根据guid和local id与instance id的映射关系,直接使用instance id去查找,减少查找开销。与guid相比,instance id只由数字组成;与local id相比,instance id位数更短。

通俗来说,guid就好比类名,只能存在一个类;local id就好比实例名,可以存在多个实例;instance id就好比快捷方式,不用查找,点一下就出来了。

资源文件本体没有记录该资源的guid,而是记录的local id。该资源的guid是由其对应的meta文件记录的。除此之外,资源的meta文件还记录了该资源的AB包名和导入设置等数据。

虽说资源文件不记自己的guid,但它记其他资源的guid。所谓其他资源,实际上就是它引用到的资源文件。


生成

Library目录下的metadata文件夹中存储着资源文件元数据(即.info文件,二进制文件)。

当Unity自动构建Library目录的时候,会根据项目中资源的guid来生成元数据。

当Unity创建/导入新资源时,会查找metadata文件夹中是否存在该资源的元数据。如果有就用存在元数据中的guid;如果没有就给该资源生成新的guid,并生成新的元数据。

在开发过程中,如果出现不同批次打的AB包不能找到引用资源的问题,大概率就是guid在不同批次生成的AB包中不同,从而无法根据guid找到引用资源。


引用

上面提到了资源之间的引用关系是由guid记录的。因此,可以通过guid在开发过程中检索所有资源的引用关系,以便对资源进行整理。并且如果出现引用对象加载失败的情况,并且没有发现什么大的问题,可以试着从guid的角度下手。


应用

1、批量资源替换工具。

2、资源引用检索工具。

3、…


后记

这一部分确实绕得头晕,在此记录一下,之后还要再回到这里补充点东西,复习一下。



补充

file id不完全等于local id,Unity有关id的命名一直都比较混乱,file id 又叫做 file guid,而 path id 又叫做 local id 或 local file identifier。file id在工程中用于关联到另一个资源文件,而在AssetBundle中用于关联另一个AssetBundle,而local id 或 path id 则对应到资源文件或AssetBundle中的某个具体的Object。

你可能感兴趣的:(Unity3D技术分享,unity,unity3d)