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=&#34;path&#34;></param>
/// <param name=&#34;paths&#34;></param>
public static void GetScriptsFilePath(string path,ref List<string> paths)
{
string repath = Path.GetDirectoryName(path).Replace(&#34;/&#34;,&#34;\\&#34;) + &#34;\\&#34;;
List<string> files = GetAllFiles(path);
if (files != null) {
string csEx = &#34;.cs&#34;;
foreach (string file in files) {
string ex = Path.GetExtension(file);
if (ex.Equals(csEx)) {
paths.Add(file.Replace(repath, string.Empty));
}
}
}else {
Debug.LogError(&#34;Error :GetScriptsFilePath &#34;+ path);
}
}
/// <summary>
/// 生成到.csproj
/// </summary>
/// <param name=&#34;path&#34;></param>
/// <param name=&#34;includePaths&#34;></param>
public static void BuildCsprojCompile(string path,List<string> includePaths)
{
using (StreamReader sr = new StreamReader(path)) {
string CompileIncludeKey = &#34;<Compile Include=&#34;;
string NoneIncludeKey = &#34;<None Include=&#34;;
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(&#34; {0}\&#34;{1}\&#34; />&#34;, CompileIncludeKey, includePaths));
}
sb.AppendLine(&#34; <Compile Include=\&#34;Properties\\AssemblyInfo.cs\&#34; />&#34;);
}
sb.AppendLine(line);
}
line = sr.ReadLine();
}
sr.Close();
sr.Dispose();
File.WriteAllText(path, sb.ToString());
}
}
/// <summary>
/// 获取路径下所有文件
/// </summary>
/// <param name=&#34;path&#34;></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]