找回密码
 立即注册
查看: 242|回复: 0

Unity构建VS工程自动化编译

[复制链接]
发表于 2023-1-1 19:33 | 显示全部楼层 |阅读模式
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[index]));
                        }
                        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兼容方案

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-4-30 12:24 , Processed in 0.092813 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表