最近在工程项目中发现,在自己的电脑上没有问题的场景,在同事的电脑上就会出问题。问题就是场景中引用到的script、prefab总是会出现Unity找不到的情况(显示“Missing xxx”)。最终发现原来是我们一开始设置的git里面,就直接移除了对.meta
文件的追踪。后来在.gitignore
中移除了相应的忽略设置后,重新上传文件,问题得到了解决。
.meta
文件的作用
在Unity中,每次我们创建一个prefab、导入文件的时候,Unity都会自动生成为这个prefab、资源文件生成一个独特的ID,这是为了方便Unity进行资源管理,在你重命名、移动资源的时候也能能够实时更新其他对这个资源的引用。例如你创建了一个prefab,prefab里面有一张图片。此时你更改了图片的名称,重新打开prefab查看(当然,旧版本的Unity需要移动到场景中才能查看,不能直接打开),就会发现你在完全没有更新图片的引用的情况下,Unity自动完成了相关资源的更新。而这就依赖Unity对每一个导入的资源、自己制作的Prefab生成唯一的ID来进行管理。
通常我们称这个ID为GUID,而这个GUID通常就保存在与资源文件同名的.meta
文件中。如果GUID丢失,那么很可能可能相关引用就会失效。
.meta
文件其实是个文本文件,你可以直接通过文本编辑工具(如VS Code)打开它,例如:
可以看到这个文件对应的GUID。其他的信息我们这里暂时不管,主要与导入设置相关。
如果你让Unity强制以文本形式保存prefab,然后用文本编辑器打开来看,还可以看到其引用的资源的GUID,这保证了Unity能够在这些资源更改了名字或者被移动到其他文件夹的时候找到它们。
但是,如果你是在Unity外面,例如在Finder(mac的资源管理器)或者文件管理器里面修改了这些资源的名字,那么就需要将.meta
文件也手动修改名字以确保.meta
文件的名字与资源名字保持一致,否则可能会导致引用失效。
总结下:.meta
文件主要保存了相应的文件的GUID,这是Unity用于资源管理的,每个资源独一份的ID,prefab中对资源的引用就依赖GUID和.meta
文件来实现。这就是为什么在使用版本跟踪工具的时候也需要跟踪.meta
文件。
参考
Unity 配置使 .prefab 可以文本化阅读修改 Behind the Scenes(Unity关于meta文件的官方文档) What is a .meta file and why does Unity create them for all of my assets? Unity中.Meta文件作用详解