Files
plugin-library/Assets/00.StaryEvo/Editor/BuildAsset/OneKeyBuildWindow.cs

229 lines
9.5 KiB
C#
Raw Normal View History

2025-05-07 10:50:44 +08:00
using System;
using System.Collections.Generic;
2025-05-30 17:00:07 +08:00
using System.Threading.Tasks;
2025-07-02 16:28:08 +08:00
#if HotUpdate
2025-05-07 10:50:44 +08:00
using HybridCLR.Editor.Commands;
2025-07-02 16:28:08 +08:00
#endif
2025-06-05 17:36:04 +08:00
using Newtonsoft.Json;
2025-05-07 10:50:44 +08:00
using Sirenix.OdinInspector;
using Sirenix.OdinInspector.Editor;
using UnityEditor;
using UnityEngine;
using YooAsset.Editor;
namespace Stary.Evo.Editor
{
public class OneKeyBuildWindow : OdinEditorWindow
{
[MenuItem("Evo/(一键)打包工具")]
static void Init()
{
2025-07-02 16:28:08 +08:00
#if NotUpdate
if (EditorUtility.DisplayDialog("提示", "当前为非热更模式,不支持热更打包功能,是否切换热更模式", "是", "否"))
{
ChangeHotUpdateSchema.SetHotUpdateMode(HotUpdateMode.HotUpdate);
}
#elif HotUpdate
2025-07-23 10:12:03 +08:00
var window = (OneKeyBuildWindow)EditorWindow.GetWindow(typeof(OneKeyBuildWindow));
2025-05-07 10:50:44 +08:00
window.Show();
2025-07-02 16:28:08 +08:00
#endif
2025-05-07 10:50:44 +08:00
}
2025-05-30 17:00:07 +08:00
[Title("全选"), OnValueChanged("OneKeyBuildEvent"), HideLabel]
public bool isOneKeyBuild;
2025-05-07 10:50:44 +08:00
[ListDrawerSettings(DraggableItems = false, ShowFoldout = false, ShowPaging = false, ShowItemCount = false,
HideRemoveButton = true)]
2025-05-30 17:00:07 +08:00
public List<OneKeyBuildEntity> OneKeyBuildEntities = new List<OneKeyBuildEntity>();
2025-05-07 10:50:44 +08:00
protected override void Initialize()
{
base.Initialize();
2025-05-30 17:00:07 +08:00
OneKeyBuildEntities.Clear();
2025-05-07 10:50:44 +08:00
var creatDomainAll = CreatAssetWindow.GetCreatDomainAll();
foreach (var domainEntity in creatDomainAll)
{
2025-05-30 17:00:07 +08:00
OneKeyBuildEntities.Add(new OneKeyBuildEntity()
2025-05-07 10:50:44 +08:00
{
DomainName = domainEntity.DomainName
});
}
}
2025-05-30 17:00:07 +08:00
[Button("(一键)标记选择资源", ButtonSizes.Large)]
public void OneClickMark()
2025-05-07 10:50:44 +08:00
{
2025-07-02 16:28:08 +08:00
#if HotUpdate
2025-05-07 10:50:44 +08:00
//打dll
CompileDllCommand.CompileDllActiveBuildTarget();
//拷贝dll
2025-05-30 17:00:07 +08:00
MarkAdressable.AddHotfixAddressableDllAll(OneKeyBuildEntities);
2025-05-07 10:50:44 +08:00
//标记全部资源
2025-05-30 17:00:07 +08:00
MarkAdressable.AddMarkAll(OneKeyBuildEntities);
2025-05-07 10:50:44 +08:00
EditorUtility.DisplayDialog("提示", $"标记所有资源完成!", "确定");
2025-07-02 16:28:08 +08:00
#endif
2025-05-07 10:50:44 +08:00
}
2025-07-23 10:12:03 +08:00
[Button("(一键)收集shader【材质异常或资源修改】", ButtonSizes.Large)]
public void OneShaderMark()
{
#if HotUpdate
//标记全部资源
foreach (var oneKeyBUildEntity in OneKeyBuildEntities)
{
if (oneKeyBUildEntity.isRaw)
{
MarkAdressable.CollectSVC(oneKeyBUildEntity.DomainName);
}
}
EditorUtility.DisplayDialog("提示", $"标记所有shader完成", "确定");
#endif
}
2025-05-30 17:00:07 +08:00
[Button("(一键)获取服务器版本", ButtonSizes.Large)]
public async void OneUpdatePackageVersion()
2025-05-07 10:50:44 +08:00
{
//打包
EditorTools.ClearUnityConsole();
2025-05-30 17:00:07 +08:00
foreach (var oneKeyBUildEntity in OneKeyBuildEntities)
2025-05-07 10:50:44 +08:00
{
if (oneKeyBUildEntity.isRaw)
{
2025-05-30 17:00:07 +08:00
BuildAssetDataSetting buildAssetDataSetting =
AssetDatabase.LoadAssetAtPath<BuildAssetDataSetting>(
$"Assets/Domain/{oneKeyBUildEntity.DomainName}/Conf/BuildAssetDataSetting.asset");
if (buildAssetDataSetting != null)
{
2025-06-23 16:07:27 +08:00
//初始化读取资源配置表
2025-07-23 10:12:03 +08:00
HotfixMainResDomain hotfixMainResDomain =
Resources.Load<HotfixMainResDomain>("HotfixMainResDomain");
2025-06-23 16:07:27 +08:00
if (hotfixMainResDomain == null)
{
Debug.LogError($"UnityEvo:读取资源配置表失败【HotfixMainResDomain】...表不存在");
continue;
}
2025-07-23 10:12:03 +08:00
2025-06-23 16:07:27 +08:00
var ip = hotfixMainResDomain.hotfixMainResDomainEntity.ipconfig;
2025-05-30 17:00:07 +08:00
string url = $"{ip}/ResDomain/GetResDomainByDomain";
var resDmainRequst = new ResDmainRequst()
{
2025-06-12 12:03:00 +08:00
ProductName = Application.identifier,
2025-05-30 17:00:07 +08:00
DomainName = oneKeyBUildEntity.DomainName,
Platform = UnityEditor.EditorUserBuildSettings.activeBuildTarget.ToString(),
};
//获取服务器版本
var resDmainMessageEntity =
await WebRequestSystem.Post(url, JsonConvert.SerializeObject(resDmainRequst));
if (resDmainMessageEntity.code == 200)
{
ResDmainResponse resDmainResponse =
JsonConvert.DeserializeObject<ResDmainResponse>(resDmainMessageEntity.data.ToString());
string[] versions = resDmainResponse.PackageVersion.Split('.');
buildAssetDataSetting.packageVersionX = int.Parse(versions[0]);
buildAssetDataSetting.packageVersionY = int.Parse(versions[1]);
buildAssetDataSetting.packageVersionZ = int.Parse(versions[2]);
buildAssetDataSetting.packageVersionZ++;
EditorUtility.SetDirty(buildAssetDataSetting);
}
2025-07-23 10:12:03 +08:00
else if (resDmainMessageEntity.code == 1011)
2025-06-05 17:45:03 +08:00
{
buildAssetDataSetting.packageVersionX = 1;
buildAssetDataSetting.packageVersionY = 0;
buildAssetDataSetting.packageVersionZ = 0;
EditorUtility.SetDirty(buildAssetDataSetting);
}
2025-05-30 17:00:07 +08:00
}
else
{
Debug.LogError("BuildAssetDataSetting 不存在:" + oneKeyBUildEntity.DomainName);
}
}
}
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
EditorUtility.DisplayDialog("提示", $"获取服务器版本完成", "确定");
}
[Button("(一键)打包选择资源", ButtonSizes.Large)]
public void OneClickBuild()
{
//打包
EditorTools.ClearUnityConsole();
2025-05-07 10:50:44 +08:00
2025-05-30 17:00:07 +08:00
foreach (var oneKeyBUildEntity in OneKeyBuildEntities)
{
if (oneKeyBUildEntity.isRaw)
{
2025-05-07 10:50:44 +08:00
BuildAssetDataSetting buildAssetDataSetting =
AssetDatabase.LoadAssetAtPath<BuildAssetDataSetting>(
$"Assets/Domain/{oneKeyBUildEntity.DomainName}/Conf/BuildAssetDataSetting.asset");
if (buildAssetDataSetting != null)
{
buildAssetDataSetting.environmentType = EnvironmentType.Release;
buildAssetDataSetting.SetEnvironmentType();
buildAssetDataSetting.viewer = new BuiltinBuildPipelineViewer(buildAssetDataSetting);
buildAssetDataSetting.viewer.clearBuildCacheToggle = true;
buildAssetDataSetting.viewer.SetBuildCacheToggle();
EditorApplication.delayCall += buildAssetDataSetting.viewer.ExecuteBuild;
}
else
{
Debug.LogError("BuildAssetDataSetting 不存在:" + oneKeyBUildEntity.DomainName);
}
}
}
EditorUtility.DisplayDialog("提示", $"开始打包资源!", "确定");
}
2025-05-30 17:00:07 +08:00
[Button("(一键)上传服务器版本", ButtonSizes.Large)]
public async void OneUpdatePackage()
{
//打包
EditorTools.ClearUnityConsole();
foreach (var oneKeyBUildEntity in OneKeyBuildEntities)
{
if (oneKeyBUildEntity.isRaw)
{
BuildAssetDataSetting buildAssetDataSetting =
AssetDatabase.LoadAssetAtPath<BuildAssetDataSetting>(
$"Assets/Domain/{oneKeyBUildEntity.DomainName}/Conf/BuildAssetDataSetting.asset");
if (buildAssetDataSetting != null)
{
string zipFilePath = BuildAssetWindow.BuildZip(buildAssetDataSetting);
2025-07-23 10:12:03 +08:00
await BuildAssetWindow.UpdateFileDataResDomain(buildAssetDataSetting, zipFilePath);
2025-05-30 17:00:07 +08:00
await Task.Delay(1000);
EditorUtility.ClearProgressBar();
}
else
{
Debug.LogError("BuildAssetDataSetting 不存在:" + oneKeyBUildEntity.DomainName);
}
}
}
2025-07-23 10:12:03 +08:00
2025-05-30 17:00:07 +08:00
EditorUtility.DisplayDialog("提示", $"服务器上传完成", "确定");
}
private void OneKeyBuildEvent()
{
for (int i = 0; i < OneKeyBuildEntities.Count; i++)
{
OneKeyBuildEntities[i].isRaw = isOneKeyBuild;
}
}
2025-05-07 10:50:44 +08:00
}
2025-05-30 17:00:07 +08:00
[Serializable]
public class OneKeyBuildEntity
2025-05-07 10:50:44 +08:00
{
[Title("是否打包", titleAlignment: TitleAlignments.Centered)] [HideLabel, HorizontalGroup("OneKeyBUildEntity")]
public bool isRaw;
[Title("包名", titleAlignment: TitleAlignments.Centered)]
[HideLabel, ReadOnly, HorizontalGroup("OneKeyBUildEntity")]
public string DomainName;
}
}