TH1/Unity/Assets/Scripts/Logic/Editor/BuildEditor.cs
2025-07-30 18:02:19 +08:00

237 lines
10 KiB
C#

/*
* @Author: 白哉
* @Description:
* @Date: 2025年07月25日 星期五 14:07:55
* @Modify:
*/
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using Logic.Config;
using UnityEditor;
using UnityEngine;
using OPS.Obfuscator.Editor;
using OPS.Obfuscator.Editor.Settings;
using TMPro;
using UnityEngine.TextCore;
using UnityEngine.TextCore.LowLevel;
namespace Logic.Editor
{
public class BuildEditor : EditorWindow
{
// 定义宏名称
public const string GAME_AUTO_DEBUG = "GAME_AUTO_DEBUG";
private VersionConfig _asset;
private uint _major;
private uint _minor;
private uint _patch;
private int _index;
// 背景
private GUIStyle _redBoxStyle;
private GUIStyle _whiteBoxStyle;
[MenuItem("Tools/打包工具")]
private static void ShowWindow()
{
var window = GetWindow<BuildEditor>();
window.titleContent = new GUIContent("打包工具");
window.Show();
}
private void OnEnable()
{
}
private void OnGUI()
{
if (_redBoxStyle == null)
{
_redBoxStyle = InspectorUtils.GetHelpBoxStyle();
InspectorUtils.AddBorder(_redBoxStyle, new Color(0.5f, 0.4f, 0.4f, 0.6f));
}
if (_whiteBoxStyle == null)
{
_whiteBoxStyle = InspectorUtils.GetHelpBoxStyle();
InspectorUtils.AddBorder(_whiteBoxStyle, new Color(1f, 1f, 1f, 0.2f));
}
var path = $"Assets/Resources/DataAssets/VersionConfig.asset";
_asset = AssetDatabase.LoadAssetAtPath<VersionConfig>(path);
if (!_asset)
{
_asset = CreateInstance<VersionConfig>();
AssetDatabase.CreateAsset(_asset, path);
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
}
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b>版本号选择: </b>");
_major = (uint)EditorGUILayout.IntField((int)_major, GUILayout.Width(20));
_minor = (uint)EditorGUILayout.IntField((int)_minor, GUILayout.Width(20));
_patch = (uint)EditorGUILayout.IntField((int)_patch, GUILayout.Width(20));
EditorGUILayout.EndHorizontal();
var versionId = _major * 10000 + _minor * 100 + _patch;
var desc = $"{_major}.{_minor}.{_patch}";
var versionInfo = _asset.GetVersionInfo(versionId);
if (versionInfo == null && InspectorUtils.InspectorButtonWithTextWidth($"创建版本号{desc}"))
{
_asset.CreateNewVersion(_major, _minor, _patch);
_asset.Versions = _asset.Versions.OrderBy(v => v.VersionId).ToList();
}
if (versionInfo != null)
{
EditorGUILayout.BeginVertical(_whiteBoxStyle);
InspectorUtils.InspectorTextWidthRich($"<b>版本{versionInfo.FullVersion}描述: </b>");
versionInfo.Description = EditorGUILayout.TextArea(versionInfo.Description, GUILayout.Height(60));
EditorGUILayout.EndVertical();
}
EditorGUILayout.Space();
if (_asset.Versions.Count == 0) return;
EditorGUILayout.BeginVertical(_redBoxStyle);
InspectorUtils.InspectorTextWidthRich($"<b>版本构建</b>");
var versionList = _asset.Versions.Select(v => $"{v.FullVersion}").ToArray();
_index = Mathf.Clamp(_index, 0, versionList.Length - 1);
_index = EditorGUILayout.Popup(_index, versionList);
var selectedVersion = _asset.Versions[_index];
EditorGUILayout.BeginHorizontal();
if (InspectorUtils.InspectorButtonWithTextWidth($"开启自动战斗")) AddAutoBattle();
if (InspectorUtils.InspectorButtonWithTextWidth($"关闭自动战斗")) RemoveAutoBattle();
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
if (InspectorUtils.InspectorButtonWithTextWidth($"构建测试包"))
{
_asset.CurVersionId = selectedVersion.VersionId;
EditorUtility.SetDirty(_asset);
AssetDatabase.SaveAssets();
// 更新Unity版本号
PlayerSettings.bundleVersion = selectedVersion.FullVersion;
// Debug包配置
SetDebugBuildSettings();
// 开始构建
// BuildPipeline.BuildPlayer(GetBuildScenes(),
// $"../Pack/Debug_{selectedVersion.FullVersion}/{Application.productName}.exe",
// BuildTarget.StandaloneWindows64,
// BuildOptions.Development | BuildOptions.AllowDebugging | BuildOptions.ConnectWithProfiler);
}
if (InspectorUtils.InspectorButtonWithTextWidth($"构建发布包"))
{
_asset.CurVersionId = selectedVersion.VersionId;
EditorUtility.SetDirty(_asset);
AssetDatabase.SaveAssets();
// 更新Unity版本号
PlayerSettings.bundleVersion = selectedVersion.FullVersion;
// Release包配置
SetReleaseBuildSettings();
// // 开始构建
// BuildPipeline.BuildPlayer(GetBuildScenes(),
// $"../Pack/Release_{selectedVersion.FullVersion}/{Application.productName}.exe",
// BuildTarget.StandaloneWindows64,
// BuildOptions.None);
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.EndVertical();
}
private void SetDebugBuildSettings()
{
// 脚本后端
PlayerSettings.SetScriptingBackend(BuildTargetGroup.Standalone, ScriptingImplementation.Mono2x);
// 开发者模式
EditorUserBuildSettings.development = true;
// 允许debug
EditorUserBuildSettings.allowDebugging = true;
// 日志等级
PlayerSettings.SetStackTraceLogType(LogType.Log, StackTraceLogType.ScriptOnly);
PlayerSettings.SetStackTraceLogType(LogType.Warning, StackTraceLogType.ScriptOnly);
PlayerSettings.SetStackTraceLogType(LogType.Error, StackTraceLogType.ScriptOnly);
PlayerSettings.SetStackTraceLogType(LogType.Assert, StackTraceLogType.ScriptOnly);
PlayerSettings.SetStackTraceLogType(LogType.Exception, StackTraceLogType.ScriptOnly);
// 开启详细日志
PlayerSettings.usePlayerLog = true;
// 开启深度剖析器
PlayerSettings.enableInternalProfiler = true;
SetObfuscationEnabled(false);
}
private void SetReleaseBuildSettings()
{
// 脚本后端
PlayerSettings.SetScriptingBackend(BuildTargetGroup.Standalone, ScriptingImplementation.IL2CPP);
// 关闭开发者模式
EditorUserBuildSettings.development = false;
// 关闭debug
EditorUserBuildSettings.allowDebugging = false;
// 日志等级(只显示错误和异常)
PlayerSettings.SetStackTraceLogType(LogType.Log, StackTraceLogType.None);
PlayerSettings.SetStackTraceLogType(LogType.Warning, StackTraceLogType.None);
PlayerSettings.SetStackTraceLogType(LogType.Error, StackTraceLogType.ScriptOnly);
PlayerSettings.SetStackTraceLogType(LogType.Assert, StackTraceLogType.ScriptOnly);
PlayerSettings.SetStackTraceLogType(LogType.Exception, StackTraceLogType.ScriptOnly);
// 关闭详细日志
PlayerSettings.usePlayerLog = false;
// 关闭深度剖析器
PlayerSettings.enableInternalProfiler = false;
// IL2CPP优化
PlayerSettings.SetIl2CppCompilerConfiguration(BuildTargetGroup.Standalone, Il2CppCompilerConfiguration.Release);
PlayerSettings.SetManagedStrippingLevel(BuildTargetGroup.Standalone, ManagedStrippingLevel.High);
// 开启OPS混淆
SetObfuscationEnabled(true);
}
private void SetObfuscationEnabled(bool enabled)
{
var trueStr = "Global_Enable_Obfuscation\",\r\n \"Value\" : \"True\"";
var falseStr = "Global_Enable_Obfuscation\",\r\n \"Value\" : \"False\"";
// 获取json文件路径
string jsonPath = "Assets/OPS/Obfuscator/Settings/Obfuscator_Settings.json";
// 读取json文件内容
string jsonContent = System.IO.File.ReadAllText(jsonPath);
if (enabled) jsonContent = jsonContent.Replace(falseStr, trueStr);
else jsonContent = jsonContent.Replace(trueStr, falseStr);
// 保存修改后的json
System.IO.File.WriteAllText(jsonPath, jsonContent);
// 刷新资源
AssetDatabase.Refresh();
}
public void AddAutoBattle()
{
string defines = PlayerSettings.GetScriptingDefineSymbolsForGroup(BuildTargetGroup.Standalone);
if (!defines.Contains(GAME_AUTO_DEBUG))
{
defines = string.IsNullOrEmpty(defines)
? GAME_AUTO_DEBUG
: defines + ";" + GAME_AUTO_DEBUG;
PlayerSettings.SetScriptingDefineSymbolsForGroup(BuildTargetGroup.Standalone, defines);
}
}
public void RemoveAutoBattle()
{
string defines = PlayerSettings.GetScriptingDefineSymbolsForGroup(BuildTargetGroup.Standalone);
if (defines.Contains(GAME_AUTO_DEBUG))
{
defines = defines.Replace($"{GAME_AUTO_DEBUG};", "")
.Replace($";{GAME_AUTO_DEBUG}", "")
.Replace(GAME_AUTO_DEBUG, "")
.Replace(";;", ";")
.Trim(';');
PlayerSettings.SetScriptingDefineSymbolsForGroup(BuildTargetGroup.Standalone, defines);
}
}
}
}