聊天记录看看就好,不顶用。实操一把梭如下:
直接修改BuildAssemblieEditor.cs文件,希望猫大不要骂我
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;
using UnityEditor;
using UnityEditor.Compilation;
using UnityEngine;
namespace ET
{
public static class BuildAssemblieEditor
{
private const string CodeDir = "Assets/Bundles/Code/";
private const string EditorCodeDir = "Assets/Editor/Code/";
[MenuItem("Tools/BuildCodeDebug _F5")]
public static void BuildCodeDebug()
{
BuildAssemblieEditor.BuildMuteAssembly("Code", new[]
{
"Codes/Model/",
"Codes/ModelView/",
"Codes/Hotfix/",
"Codes/HotfixView/"
}, Array.Empty<string>(), CodeOptimization.Debug);
AfterCompiling();
AssetDatabase.Refresh();
}
[MenuItem("Tools/BuildCodeRelease _F6")]
public static void BuildCodeRelease()
{
BuildAssemblieEditor.BuildMuteAssembly("Code", new[]
{
"Codes/Model/",
"Codes/ModelView/",
"Codes/Hotfix/",
"Codes/HotfixView/"
}, Array.Empty<string>(), CodeOptimization.Release);
AfterCompiling();
AssetDatabase.Refresh();
}
[MenuItem("Tools/BuildData _F7")]
public static void BuildData()
{
BuildAssemblieEditor.BuildMuteAssembly("Data", new[]
{
"Codes/Model/",
"Codes/ModelView/",
}, Array.Empty<string>(), CodeOptimization.Debug);
}
[MenuItem("Tools/BuildLogic _F8")]
public static void BuildLogic()
{
string[] logicFiles = Directory.GetFiles(Define.BuildOutputDir, "Logic_*");
foreach (string file in logicFiles)
{
File.Delete(file);
}
int random = RandomHelper.RandomNumber(100000000, 999999999);
string logicFile = $"Logic_{random}";
BuildAssemblieEditor.BuildMuteAssembly(logicFile, new[]
{
"Codes/Hotfix/",
"Codes/HotfixView/",
}, new[] { Path.Combine(Define.BuildOutputDir, "Data.dll") }, CodeOptimization.Debug);
}
private static void BuildMuteAssembly(string assemblyName, string[] CodeDirectorys, string[] additionalReferences, CodeOptimization codeOptimization)
{
List<string> scripts = new List<string>();
for (int i = 0; i < CodeDirectorys.Length; i++)
{
DirectoryInfo dti = new DirectoryInfo(CodeDirectorys[i]);
FileInfo[] fileInfos = dti.GetFiles("*.cs", System.IO.SearchOption.AllDirectories);
for (int j = 0; j < fileInfos.Length; j++)
{
scripts.Add(fileInfos[j].FullName);
}
}
string dllPath = Path.Combine(Define.BuildOutputDir, $"{assemblyName}.dll");
string pdbPath = Path.Combine(Define.BuildOutputDir, $"{assemblyName}.pdb");
if (Directory.Exists(Define.BuildOutputDir))
{
File.Delete(dllPath);
File.Delete(pdbPath);
}
else
Directory.CreateDirectory(Define.BuildOutputDir);
AssemblyBuilder assemblyBuilder = new AssemblyBuilder(dllPath, scripts.ToArray());
//启用UnSafe
//assemblyBuilder.compilerOptions.AllowUnsafeCode = true;
BuildTargetGroup buildTargetGroup = BuildPipeline.GetBuildTargetGroup(EditorUserBuildSettings.activeBuildTarget);
assemblyBuilder.compilerOptions.CodeOptimization = codeOptimization;
assemblyBuilder.compilerOptions.ApiCompatibilityLevel = PlayerSettings.GetApiCompatibilityLevel(buildTargetGroup);
// assemblyBuilder.compilerOptions.ApiCompatibilityLevel = ApiCompatibilityLevel.NET_4_6;
assemblyBuilder.additionalReferences = additionalReferences;
assemblyBuilder.flags = AssemblyBuilderFlags.None;
//AssemblyBuilderFlags.None 正常发布
//AssemblyBuilderFlags.DevelopmentBuild 开发模式打包
//AssemblyBuilderFlags.EditorAssembly 编辑器状态
assemblyBuilder.referencesOptions = ReferencesOptions.UseEngineModules;
assemblyBuilder.buildTarget = EditorUserBuildSettings.activeBuildTarget;
assemblyBuilder.buildTargetGroup = buildTargetGroup;
assemblyBuilder.excludeReferences = new string[] { "Library/ScriptAssemblies/Unity.Editor.dll" };
assemblyBuilder.buildStarted += delegate (string assemblyPath) { Debug.LogFormat("build start:" + assemblyPath); };
assemblyBuilder.buildFinished += delegate (string assemblyPath, CompilerMessage[] compilerMessages)
{
int errorCount = compilerMessages.Count(m => m.type == CompilerMessageType.Error);
int warningCount = compilerMessages.Count(m => m.type == CompilerMessageType.Warning);
Debug.LogFormat("Warnings: {0} - Errors: {1}", warningCount, errorCount);
if (warningCount > 0)
{
Debug.LogFormat("有{0}个Warning!!!", warningCount);
}
if (errorCount > 0)
{
for (int i = 0; i < compilerMessages.Length; i++)
{
if (compilerMessages[i].type == CompilerMessageType.Error)
{
Debug.LogError(compilerMessages[i].message);
}
}
}
};
//assemblyBuilder.excludeReferences = new string[] { "Unity.Editor.dll" };
//开始构建
if (!assemblyBuilder.Build())
{
Debug.LogErrorFormat("build fail:" + assemblyBuilder.assemblyPath);
return;
}
}
private static void AfterCompiling()
{
while (EditorApplication.isCompiling)
{
Debug.Log("Compiling wait1");
// 主线程sleep并不影响编译线程
Thread.Sleep(1000);
Debug.Log("Compiling wait2");
}
Debug.Log("Compiling finish");
Directory.CreateDirectory(CodeDir);
File.Copy(Path.Combine(Define.BuildOutputDir, "Code.dll"), Path.Combine(CodeDir, "Code.dll.bytes"), true);
File.Copy(Path.Combine(Define.BuildOutputDir, "Code.pdb"), Path.Combine(CodeDir, "Code.pdb.bytes"), true);
File.Copy(Path.Combine(Define.BuildOutputDir, "Code.dll"), Path.Combine(EditorCodeDir, "Code.dll"), true);
File.Copy(Path.Combine(Define.BuildOutputDir, "Code.pdb"), Path.Combine(EditorCodeDir, "Code.pdb"), true);
AssetDatabase.Refresh();
Debug.Log("copy Code.dll to Bundles/Code success!");
// 设置ab包
AssetImporter assetImporter1 = AssetImporter.GetAtPath("Assets/Bundles/Code/Code.dll.bytes");
assetImporter1.assetBundleName = "Code.unity3d";
AssetImporter assetImporter2 = AssetImporter.GetAtPath("Assets/Bundles/Code/Code.pdb.bytes");
assetImporter2.assetBundleName = "Code.unity3d";
AssetDatabase.Refresh();
Debug.Log("set assetbundle success!");
Debug.Log("build success!");
}
}
}