在使用UPM(Unity Package Manager)管理项目插件的时候,我们会遇到需要修改源码的情况。但是每次修改完代码就会被回滚到初始状态,因为UMP会对文件进行校验,发现与网络上的包不一致的情况下就会重新下载。
解决代码回滚的情况:
方法一:手动复制package文件夹
一、在文件管理器中找到你要修改的package文件夹,YourProject/Library/PackageCache文件夹里存放着很多的只读的packages,找到你要修改的package。
二、把整个文件夹复制一份到YourProject/Packages文件夹中。原本Package文件夹中只有两个json文件。
三、把文件夹及子文件的权限改成非只读。
四、再用vs打开要修改的代码进行修改,这时候就不会回滚了。
方法二:使用Unity提供的api,自动把packag嵌入到项目中,不再与package服务器中版本进行校验。
一、在Editor文件夹中新建一个脚本“EmbedPackage.cs”。
二、粘贴下面的代码。
using System.IO; using UnityEditor.PackageManager; using UnityEngine; namespace UnityEditor.Extensions { #if UNITY_2017_3_OR_NEWER /// <summary> /// Editor extension for embedding packages as a local copy in the project. /// This can be useful in case you want to modify the package's source code. /// </summary> public static class EmbedPackage { [MenuItem("Assets/Embed Package", false, 1000000)] private static void EmbedPackageMenuItem() { var selection = Selection.activeObject; var packageName = Path.GetFileName(AssetDatabase.GetAssetPath(selection)); Debug.Log($"Embedding package '{packageName}' into the project."); Client.Embed(packageName); AssetDatabase.Refresh(); } [MenuItem("Assets/Embed Package", true)] private static bool EmbedPackageValidation() { var selection = Selection.activeObject; if (selection == null) { return false; } var path = AssetDatabase.GetAssetPath(selection); var folder = Path.GetDirectoryName(path); // We only deal with direct folders under Packages/ return folder == "Packages"; } } #endif }
三、在Project窗口中点选你要修改的package,然后打开右键菜单。选择弹窗最下面的Embed Package。
四、自动把你选择的package嵌入到项目中,断开了与服务器的连接。这时候做进行修改就不会回滚了。
注意事项:如果要嵌入的包是在Edit>ProjectSetting>PackageManager>ScopedRegistry中注册添加的,第二种嵌入方式无效。 2022-09-06