不久之前,Unity官方推出PackageManager这样的功能,用以集成unity官方出的各种插件,但是这个玩意用起来有很多不舒服的地方,不仅打开之后刷新速度特别慢,而且可能产生刷新不出来想要的插件的情况。一定概率长时间刷不出任何东西(仅能通过断网暂时解决)。最难受的一点就是对于程序员来讲,更改或调试下载下来的插件代码特别麻烦,如果使用寻常打开cs文件的方式,双击之后,在Visual Studio之中不仅无法跳转函数,而且使用类似Debug.Log这样的函数无法给出补全。
这几天想了解一下SRP、LWRP、HDRP的相关源码,所以非常需要一个调试环境,通过打断点调试、修改源码、跨文件跳转定义、Debug.Log这样的方式可以快速了解源码结构。而创建一个新的LWRP工程,然后使用VS很明显是不行的。通过右键打开,可以看到所有的 Packages下的包都是在Library\PackageCache路径下,所以我们在Asset下的VS工程是没办法包含到这里的。
这里我们就要猜测一下PackageManager里的包是如何加载到工程里面的了,根据文档,当打开一个项目,unity内部会通过Packages文件夹下的manifest.json文件为每个包对服务器发起请求,服务器返回请求的信息和数据给unity,然后unity开始在工程中安装这些包。每个项目都有一个独有的manifest 文件,作为项目的依赖项。但是根据实操,这个过程还漏了一步,就是当通过对比发现项目Library\PackageCache下的代码被改动过时,unity会自动使用官方代码覆盖改动过的代码。这可以通过更改Library\PackageCache下的代码,然后重启unity验证。官方将这些代码定义为immutable(read-only)的,原文:Unity treats package Assets just like any other Asset in the Project, except that these Assets are immutable(read-only).