maltadirk 发表于 2023-1-1 19:33

Unity构建VS工程自动化编译

Unity 开发中有些独立的核心模块,为防止核心内容轻易泄露我们需要编译DLL 库,
又或者发布Unity插件独立包(Unity Package) 不希望源代码直接暴露,那么我们可以考虑构建一个高效率的工作流环境。
这里引入 Runtime 工作环境(用源代码脚本在Unity内运行)与 Release 工作环境(用 DLL库 在Unity内运行)
栗子环境: Unity 2018.4.36f1 、Visual Studio 2017
一、构建独立的 Unity VS 工程

1.使用 VS 新建 工程


2.添加需要引用的Unity dll
..\Unity\2018.4.36f1\Editor\Data\Managed\UnityEngine.dll




3.两步操作简单的编译工程已构建好。

二、构建脚本引用



1.新建BAT脚本文件,关联脚本到VS,点击所有文件并包含在项目中,点击生成,我们得到了编译后的 DLL 。
mklink /j %CurPath%\VS\UnityLibVS\UnityLibVS\UnityLib %CurPath%\..\Assets\Scripts\UnityLib

2.自动编译到Unity内
set CurPath=%~dp0
set VSIDEPath=D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE
::切换IDE运行环境
D:
cd %VSIDEPath%
::用dll 运行工程
devenv %CurPath%\VS\UnityLibVS\UnityLibVS.sln /Build
copy %CurPath%\VS\UnityLibVS\UnityLibVS\bin\Debug\UnityLibVS.dll %CurPath%\..\Assets\Plugins
pause

3.通过 1,2步骤 已经把自己的源码生成 dll,实际开发环境的源码是会新增或者删除的,当我们新增删除源码,应当自动更新vs 工程上的源码。
VS工程文件引用保存在 .csproj,编译每次自动更新收集。


   /// <summary>
    /// 收集源代码
    /// </summary>
    /// <param name="path"></param>
    /// <param name="paths"></param>
    public static void GetScriptsFilePath(string path,ref List<string> paths)
    {
      string repath = Path.GetDirectoryName(path).Replace("/","\\") + "\\";
      List<string> files = GetAllFiles(path);
      if (files != null) {
            string csEx = ".cs";
            foreach (string file in files) {
                string ex = Path.GetExtension(file);
                if (ex.Equals(csEx)) {
                  paths.Add(file.Replace(repath, string.Empty));
                }
            }
      }else {
            Debug.LogError("Error :GetScriptsFilePath "+ path);
      }
    }

    /// <summary>
    /// 生成到.csproj
    /// </summary>
    /// <param name="path"></param>
    /// <param name="includePaths"></param>
    public static void BuildCsprojCompile(string path,List<string> includePaths)
    {
      using (StreamReader sr = new StreamReader(path)) {
            string CompileIncludeKey = "<Compile Include=";
            string NoneIncludeKey = "<None Include=";
            bool bCompile = false;
            StringBuilder sb = new StringBuilder();
            string line = sr.ReadLine();
            while (line != null) {
                if (line.IndexOf(CompileIncludeKey) >= 0) {
                  bCompile = true;
                }
                else if (line.IndexOf(NoneIncludeKey) >= 0) {

                }
                else {
                  if (bCompile) {
                        bCompile = false;
                        int count = includePaths.Count;
                        for (int index = 0;index < includePaths.Count;index++) {
                            sb.AppendLine(string.Format("    {0}\"{1}\" />", CompileIncludeKey, includePaths));
                        }
                        sb.AppendLine("    <Compile Include=\"Properties\\AssemblyInfo.cs\" />");
                  }
                  sb.AppendLine(line);
                }
                line = sr.ReadLine();
            }
            sr.Close();
            sr.Dispose();
            File.WriteAllText(path, sb.ToString());
      }
    }

      /// <summary>
      /// 获取路径下所有文件
      /// </summary>
      /// <param name="path"></param>
      /// <returns></returns>
      public static List<string> GetAllFiles(string path)
      {
            if (Directory.Exists(path) == false) { return null; }
            DirectoryInfo dir = new DirectoryInfo(path);
            DirectoryInfo[] directories = dir.GetDirectories();
            List<string> fileList = new List<string>();

            FileInfo[] f = dir.GetFiles();
            foreach (FileInfo item in f) {
                fileList.Add(item.FullName);
            }
            foreach (DirectoryInfo dirX in directories) {
                List<string> files = GetAllFiles(dirX.FullName);
                for (int i = 0; i < files.Count; i++) {
                  fileList.Add(files);
                }
            }
            return fileList.ToArray().OrderBy(s => new FileInfo(s).CreationTime).ToList();
      }

三、替换DLL后预设与场景的脚本丢失, guid与FileId 引用修复


刘666:Unity2020降至Unity2018-UI兼容方案
页: [1]
查看完整版本: Unity构建VS工程自动化编译