框架上传

This commit is contained in:
2025-03-31 11:16:52 +08:00
parent 7197b4c0d0
commit ffcdddbd2a
429 changed files with 19115 additions and 1579 deletions

View File

@@ -0,0 +1,241 @@
using System;
using System.Collections.Generic;
using Sirenix.OdinInspector;
using UnityEditor;
using UnityEngine;
using YooAsset;
using YooAsset.Editor;
namespace Stary.Evo.Editor
{
[CreateAssetMenu(fileName = "BuildAssetDataSetting", menuName = "Evo/BuildAssetDataSetting")]
public class BuildAssetDataSetting : SerializedScriptableObject
{
public void OnEnable()
{
buildTarget = EditorUserBuildSettings.activeBuildTarget.ToString();
GetPackageVersion();
oldVersionX = packageVersionX;
oldVersionY = packageVersionY;
oldVersionZ = packageVersionZ;
}
[HideInInspector] public string packageName;
[HideInInspector]public int packageVersionX = 1;
[HideInInspector]public int packageVersionY;
[HideInInspector]public int packageVersionZ;
private int oldVersionX = 1;
private int oldVersionY;
private int oldVersionZ;
[Title("目标环境", titleAlignment: TitleAlignments.Centered)]
[HorizontalGroup("BuildSetting"), HideLabel]
[OnValueChanged("SetEnvironmentType")]
public EnvironmentType environmentType;
[Title("当前打包平台", titleAlignment: TitleAlignments.Centered)]
[ReadOnly]
[HorizontalGroup("BuildSetting"), HideLabel]
public string buildTarget;
private const string VerSersionMessage = "(小版本由打包叠加,中版本、大版本更新会重置小版本,如误操作,点击重置按钮即可)";
[TitleGroup("当前打包版本号", alignment: TitleAlignments.Centered)]
[ReadOnly]
[HorizontalGroup("当前打包版本号/PackageVersion"), HideLabel]
public string packageVersion;
[HorizontalGroup("当前打包版本号/PackageVersion"), HideLabel, EnumToggleButtons]
[HideIf("environmentType", EnvironmentType.Debug)]
public VersionPosType VersionType;
[HorizontalGroup("当前打包版本号/PackageVersion"), HideLabel, Button(Icon = SdfIconType.Plus)]
[HideIf("environmentType", EnvironmentType.Debug)]
public void AddBigVersion()
{
if (VersionType == VersionPosType.X)
{
packageVersionX++;
}
else if (VersionType == VersionPosType.Y)
{
packageVersionY++;
}
if (packageVersionZ > 0)
packageVersionZ = 0;
GetPackageVersion();
}
[HorizontalGroup("当前打包版本号/PackageVersion"), HideLabel, Button(Icon = SdfIconType.Dash)]
[HideIf("environmentType", EnvironmentType.Debug)]
public void SubBigVersion()
{
if (VersionType == VersionPosType.X)
{
packageVersionX--;
}
else if (VersionType == VersionPosType.Y)
{
packageVersionY--;
}
if (packageVersionZ > 0)
packageVersionZ = 0;
GetPackageVersion();
}
[HorizontalGroup("当前打包版本号/PackageVersion"), HideLabel, Button(Icon = SdfIconType.ArrowRepeat)]
[HideIf("environmentType", EnvironmentType.Debug)]
public void RepeatVersion()
{
packageVersionX = oldVersionX;
packageVersionY = oldVersionY;
packageVersionZ = oldVersionZ;
GetPackageVersion();
}
[Title("构建列表", titleAlignment: TitleAlignments.Centered)]
[HorizontalGroup("BuildPipeline"), HideLabel]
[OnValueChanged("SetBuildPipelines")]
public EBuildPipeline selectedBuildPipelines;
[Title("加密列表", titleAlignment: TitleAlignments.Centered)]
[HorizontalGroup("BuildPipeline"), HideLabel]
[ValueDropdown("GetEncryptionServices")]
[OnValueChanged("SetEncryptionServices")]
public Type encryption;
[HideLabel] public AbstractBuildPipelineViewer viewer;
[HideLabel] private Dictionary<EBuildPipeline, AbstractBuildPipelineViewer> _viewers;
public void SetEnvironmentType()
{
GetPackageVersion();
}
public string GetBuildPackageVersion(bool isUpdate = false)
{
if (environmentType == EnvironmentType.Debug)
{
return "Simulate";
}
if (environmentType == EnvironmentType.Release)
{
string version =
$"{packageVersionX}.{packageVersionY}.{packageVersionZ}";
if (isUpdate)
packageVersionZ++;
packageVersion = $"{packageVersionX}.{packageVersionY}.{packageVersionZ}";
return version;
}
return null;
}
public void GetPackageVersion()
{
SetBuildPipelines();
if (environmentType == EnvironmentType.Debug)
{
viewer.clearBuildCacheToggle = true;
selectedBuildPipelines = EBuildPipeline.EditorSimulateBuildPipeline;
packageVersion = "Simulate";
}
else if (environmentType == EnvironmentType.Release)
{
viewer.clearBuildCacheToggle = false;
selectedBuildPipelines = EBuildPipeline.BuiltinBuildPipeline;
packageVersionX = packageVersionX > 1 ? packageVersionX : 1;
packageVersionY =
packageVersionY > 0 ? packageVersionY : 0;
packageVersion =
$"{packageVersionX}.{packageVersionY}.{packageVersionZ}";
}
viewer.SetBuildCacheToggle();
AssetDatabase.SaveAssets();
//BuildServerPath();
}
/// <summary>
/// 设置当前构建管线
/// </summary>
/// <returns></returns>
private void SetBuildPipelines()
{
BuildPipelineViewer();
}
/// <summary>
/// 生成打包实例
/// </summary>
public void BuildPipelineViewer()
{
if (_viewers == null)
_viewers = new Dictionary<EBuildPipeline, AbstractBuildPipelineViewer>();
if (_viewers.ContainsKey(selectedBuildPipelines))
{
viewer = _viewers[selectedBuildPipelines];
}
else
{
switch (selectedBuildPipelines)
{
case EBuildPipeline.EditorSimulateBuildPipeline:
viewer = new SimulateBuildPipelineViewer(this);
break;
case EBuildPipeline.BuiltinBuildPipeline:
viewer = new BuiltinBuildPipelineViewer(this);
break;
case EBuildPipeline.ScriptableBuildPipeline:
viewer = new ScriptableBuildPipelineViewer(this);
break;
case EBuildPipeline.RawFileBuildPipeline:
viewer = new RawfileBuildpipelineViewer(this);
break;
}
_viewers.Add(selectedBuildPipelines, viewer);
}
}
private List<Type> GetEncryptionServices()
{
var encryptionClassTypes = EditorTools.GetAssignableTypes(typeof(IEncryptionServices));
if (encryption.IsNull())
{
encryption = encryptionClassTypes[0];
}
return encryptionClassTypes;
}
private void SetEncryptionServices()
{
AssetBundleBuilderSetting.SetPackageEncyptionClassName(packageName, selectedBuildPipelines,
encryption.FullName);
}
}
public enum VersionPosType
{
X,
Y,
}
public enum EnvironmentType
{
Debug,
Release,
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 39a67460f559484da2b52def8ff05571
timeCreated: 1741844184

View File

@@ -0,0 +1,60 @@
using System;
using Sirenix.OdinInspector;
using UnityEngine;
namespace Stary.Evo.Editor
{
[Serializable]
public class BuildAssetEntity
{
public BuildAssetEntity(string HorizontalGroupName,string ButtonName ,Action OnClickAction )
{
this.HorizontalGroupName = HorizontalGroupName;
this.ButtonName = ButtonName;
this.OnClickAction = OnClickAction;
}
private Color messageColor = Color.white;
private string messageText = "点击开始进程!!!!!";
private bool showInfoBox = true;
private string HorizontalGroupName;
private string ButtonName;
private Action OnClickAction;
[HorizontalGroup("@ HorizontalGroupName")]
[Button("@ ButtonName", ButtonSizes.Large)]
[InfoBox("@ messageText", InfoMessageType.Error, "@ showInfoBox==false")]
[InfoBox("@ messageText", InfoMessageType.Info, "@ showInfoBox==true")]
private void CopyDll()
{
try
{
OnClickAction?.Invoke();
showInfoBox = true;
messageColor = Color.green;
messageText = "进程结束!!!!!";
}
catch (Exception e)
{
Debug.LogError(e);
showInfoBox = false;
messageText =$"进程存在异常,异常信息为:【{e.Message}】" ;
messageColor = Color.red;
}
}
[HorizontalGroup("@ HorizontalGroupName", Width = 68)]
[Button(ButtonSizes.Large, Icon = SdfIconType.CheckCircleFill, IconAlignment = IconAlignment.RightEdge,
ButtonHeight = 68),
GUIColor("@messageColor")]
private void CopyDll1()
{
}
public void SetButtonName(string ButtonName)
{
this.ButtonName = ButtonName;
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 689d3c7b06e841668647fc00ff0a3dd8
timeCreated: 1741593629

View File

@@ -0,0 +1,281 @@
/****************************************************
文件BuildAssetWindow.cs
作者xosmo_
邮箱:
日期2025/3/10 10:43:20
功能:
*****************************************************/
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using EditorFramework;
using HybridCLR.Editor;
using HybridCLR.Editor.Commands;
using Sirenix.OdinInspector;
using Sirenix.OdinInspector.Editor;
using UnityEditor;
using UnityEditorInternal;
using UnityEngine;
using UnityEngine.Serialization;
using YooAsset;
using YooAsset.Editor;
namespace Stary.Evo.Editor
{
public class BuildAssetWindow : OdinEditorWindow
{
private static BuildAssetWindow window;
[MenuItem("Evo/资源打包工具")]
static void ShowWindows()
{
if (CreatAssetWindow.GetCreatDomainAll().Count <= 0)
{
EditorUtility.DisplayDialog("提示", "不存在Domain元素无法打开此面板请先创建Domain元素", "确定" );
return;
}
window = (BuildAssetWindow)EditorWindow.GetWindow(typeof(BuildAssetWindow));
window.Show();
}
protected override void Initialize()
{
base.Initialize();
GetBuildPackageNames();
}
public static void RemoveBuildAssetWindow()
{
if(window != null)
window.Close();
}
protected void OnSelectionChange()
{
EditorUtility.SetDirty(BuildAssetDataSetting);
AssetDatabase.SaveAssets();
//AssetDatabase.Refresh();
}
[Title("包裹列表", titleAlignment: TitleAlignments.Centered)]
[HorizontalGroup("BuildPipeline"), HideLabel]
[ValueDropdown("GetBuildPackageNames")]
[OnValueChanged("SetBuildPackageNames")]
public string selectedPackageNames;
public static string packageName;
#region HyBridCLRBuild
[Title("HyBridCLRBuild", titleAlignment: TitleAlignments.Centered)] [HideLabel]
public BuildAssetEntity hyBridClrBuildEntity =
new BuildAssetEntity("HyBridCLRBuild", "DllBuildTarget", () =>
{
//PrebuildCommand.GenerateAll();
CompileDllCommand.CompileDllActiveBuildTarget();
});
#endregion
#region MarkAsset
[Title("MarkAsset", titleAlignment: TitleAlignments.Centered)] [HideLabel]
public BuildAssetEntity markAssetEntity =
new BuildAssetEntity("MarkAsset", "MarkAsset", MarkAdressable.AddMark);
#endregion
#region BuildAsset
[InlineEditor(InlineEditorObjectFieldModes.CompletelyHidden)]
[HideLabel] public BuildAssetDataSetting BuildAssetDataSetting;
/// <summary>
/// 检测当前所有包裹
/// </summary>
/// <returns></returns>
private List<string> GetBuildPackageNames()
{
List<string> result = new List<string>();
foreach (var name in CreatAssetWindow.GetCreatDomainAllName())
{
result.Add(name);
}
if (selectedPackageNames.IsNullOrEmpty())
{
// string buildPackageName = DataSetting.packageName;
// if (result.Exists(p => p == buildPackageName))
// {
// selectedPackageNames = buildPackageName;
// }
// else
// {
selectedPackageNames = result[0];
//}
}
SetBuildPackageNames();
return result;
}
/// <summary>
/// 设置当前包裹
/// </summary>
/// <returns></returns>
private void SetBuildPackageNames()
{
//PlayerPrefs.SetString("BuildPackageNames", selectedPackageNames);
// DataSetting.packageName = selectedPackageNames;
packageName = selectedPackageNames;
// DataSetting = Resources.Load<BuildAssetDataSetting>("BuildAssetDataSetting");
string buildAssetDataSettingPath = $"Assets/Domain/{selectedPackageNames}/Conf/BuildAssetDataSetting.asset";
BuildAssetDataSetting buildAssetDataSetting =
AssetDatabase.LoadAssetAtPath<BuildAssetDataSetting>(buildAssetDataSettingPath);
if (buildAssetDataSetting != null)
{
BuildAssetDataSetting = buildAssetDataSetting;
Init();
}
else
{
Debug.LogError($"UnityEvo:BuildAssetDataSetting 不存在,请检查路径{buildAssetDataSettingPath}");
}
}
/// <summary>
/// 获取当前包裹
/// </summary>
/// <returns></returns>
public static string GetBuildPackageName()
{
return packageName;
}
#endregion
#region Update
[Title("BuildAssetButton", titleAlignment: TitleAlignments.Centered)] [HideLabel]
public BuildAssetEntity onBuildPipelineEntity;
[FormerlySerializedAs("UpdateServerPath")]
[TitleGroup("UpdateAssetButton", alignment: TitleAlignments.Centered)][ShowIf("@ BuildAssetDataSetting.environmentType== EnvironmentType.Release",true)]
[ReadOnly]
[InfoBox("服务器资源盘位未存在", InfoMessageType.Error, "@ _isCheckDriveExist==false")]
[InfoBox("1、映射网络驱动器\n2、添加http://192.168.31.100:5005/alist/HotRefresh地址\n3、设置盘符为Z盘", InfoMessageType.Info,
"@ _isCheckDriveExist==false")]
public string updateServerPath;
private bool _isCheckDriveExist;
[TitleGroup("UpdateAssetButton", alignment: TitleAlignments.Centered)] [HideLabel][ShowIf("@ _isCheckDriveExist&&BuildAssetDataSetting.environmentType== EnvironmentType.Release",true)]
public BuildAssetEntity onUpdateBuildPipelineEntity;
private void OnBuildPipeline()
{
if (EditorUtility.DisplayDialog("提示", $"开始构建资源包[{selectedPackageNames}]", "Yes", "No"))
{
EditorTools.ClearUnityConsole();
EditorApplication.delayCall += BuildAssetDataSetting.viewer.ExecuteBuild;
}
else
{
Debug.LogWarning("[Build] 打包已经取消");
}
}
private void OnUpdateBuildPipeline()
{
if (EditorUtility.DisplayDialog("提示", $"开始上传至服务器[{selectedPackageNames}]", "Yes", "No"))
{
Stary.Evo.Editor.FileUtility.CopyDirectory(
$"{AssetBundleBuilderHelper.GetDefaultBuildOutputRoot()}/{EditorUserBuildSettings.activeBuildTarget}/{BuildAssetDataSetting.packageName}/{BuildAssetDataSetting.packageVersion}",
updateServerPath);
CreatePackageVersionJson();
BuildAssetDataSetting.GetBuildPackageVersion(true);
EditorUtility.DisplayDialog("提示", $"上传服务器完成!", "确定");
}
else
{
Debug.LogWarning("[Update] 上传已经取消");
}
}
#endregion
protected void Init()
{
//Update
//检测Z盘
_isCheckDriveExist = Stary.Evo.Editor.FileUtility.CheckDriveExists("Z");
onBuildPipelineEntity =
new BuildAssetEntity("打包", $"打包资源包【版本:{BuildAssetDataSetting.packageVersion}】", OnBuildPipeline);
onUpdateBuildPipelineEntity =
new BuildAssetEntity("更新", $"更新至服务器【版本:{BuildAssetDataSetting.packageVersion}】", OnUpdateBuildPipeline);
}
private Vector2 scroll;
protected override void DrawEditor(int index)
{
scroll = GUILayout.BeginScrollView(scroll);
{
base.DrawEditor(index);
BuildServerPath();
}
GUILayout.EndScrollView();
}
/// <summary>
/// 生成服务器路径
/// </summary>
private void BuildServerPath()
{
if (!_isCheckDriveExist)
{
return;
}
updateServerPath =
$"Z:/{Application.productName}/{BuildAssetDataSetting.packageName}/{EditorUserBuildSettings.activeBuildTarget}/{BuildAssetDataSetting.packageVersion}";
if (!Directory.Exists(updateServerPath))
Directory.CreateDirectory(updateServerPath);
//更新Button文字
onBuildPipelineEntity.SetButtonName($"打包资源包【版本:{BuildAssetDataSetting.packageVersion}】");
onUpdateBuildPipelineEntity.SetButtonName($"更新至服务器【版本:{BuildAssetDataSetting.packageVersion}】");
}
private void CreatePackageVersionJson()
{
string mainResDomainPath = $"Assets/Domain/{selectedPackageNames}/Conf/HotfixMainResDomain.asset";
HotfixMainResDomain mainResDomain =
AssetDatabase.LoadAssetAtPath<HotfixMainResDomain>(mainResDomainPath);
if (mainResDomain != null)
{
mainResDomain.hotfixMainResDomainEntity.packageVersion = BuildAssetDataSetting.packageVersion;
mainResDomain.hotfixMainResDomainEntity.pathconfig =
$"{Application.productName}/{BuildAssetDataSetting.packageName}/{EditorUserBuildSettings.activeBuildTarget}/{BuildAssetDataSetting.packageVersion}";
}
AssetDatabase.Refresh();
// 保存更改
AssetDatabase.SaveAssets();
string serverPath = $"Z:/HybridclrConfigData/{BuildAssetDataSetting.packageName}/{EditorUserBuildSettings.activeBuildTarget}/";
//直接保存服务器路径下,本地不保存
EditorFrameworkUtils.SaveJson(mainResDomain.hotfixMainResDomainEntity, serverPath, Application.productName);
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 80143df6d596f664f97e7139d7811d2d
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,49 @@
using System;
using UnityEditor;
using YooAsset;
using YooAsset.Editor;
namespace Stary.Evo.Editor
{
[Serializable]
public class BuiltinBuildPipelineViewer :AbstractBuildPipelineViewer
{
public BuiltinBuildPipelineViewer(BuildAssetDataSetting packageName) : base(packageName)
{
}
public override void ExecuteBuild()
{
var fileNameStyle = AssetBundleBuilderSetting.GetPackageFileNameStyle(dataSetting.packageName, dataSetting.selectedBuildPipelines);
var buildinFileCopyOption = AssetBundleBuilderSetting.GetPackageBuildinFileCopyOption(dataSetting.packageName, dataSetting.selectedBuildPipelines);
var buildinFileCopyParams = AssetBundleBuilderSetting.GetPackageBuildinFileCopyParams(dataSetting.packageName, dataSetting.selectedBuildPipelines);
var compressOption = AssetBundleBuilderSetting.GetPackageCompressOption(dataSetting.packageName, dataSetting.selectedBuildPipelines);
var clearBuildCache = AssetBundleBuilderSetting.GetPackageClearBuildCache(dataSetting.packageName, dataSetting.selectedBuildPipelines);
var useAssetDependencyDB = AssetBundleBuilderSetting.GetPackageUseAssetDependencyDB(dataSetting.packageName, dataSetting.selectedBuildPipelines);
BuiltinBuildParameters buildParameters = new BuiltinBuildParameters();
buildParameters.BuildOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot();
buildParameters.BuildinFileRoot = AssetBundleBuilderHelper.GetStreamingAssetsRoot();
buildParameters.BuildPipeline = dataSetting.selectedBuildPipelines.ToString();
buildParameters.BuildBundleType = (int)EBuildBundleType.AssetBundle;
buildParameters.BuildTarget = EditorUserBuildSettings.activeBuildTarget;
buildParameters.PackageName = dataSetting.packageName;
buildParameters.PackageVersion =dataSetting.GetBuildPackageVersion();
buildParameters.EnableSharePackRule = true;
buildParameters.VerifyBuildingResult = true;
buildParameters.FileNameStyle = fileNameStyle;
buildParameters.BuildinFileCopyOption = buildinFileCopyOption;
buildParameters.BuildinFileCopyParams = buildinFileCopyParams;
buildParameters.CompressOption = compressOption;
buildParameters.ClearBuildCacheFiles = clearBuildCache;
buildParameters.UseAssetDependencyDB = useAssetDependencyDB;
buildParameters.EncryptionServices = CreateEncryptionInstance();
BuiltinBuildPipeline pipeline = new BuiltinBuildPipeline();
var buildResult = pipeline.Run(buildParameters, true);
if (buildResult.Success)
EditorUtility.RevealInFinder(buildResult.OutputPackageDirectory);
base.ExecuteBuild();
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: ac3d61d6f0744f02a2f038fdeed98b75
timeCreated: 1741830306

View File

@@ -0,0 +1,272 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using EditorFramework;
using HybridCLR.Editor;
using HybridCLR.Editor.Settings;
using Sirenix.OdinInspector;
using Sirenix.OdinInspector.Editor;
using Sirenix.Utilities;
using UnityEditor;
using UnityEditorInternal;
using UnityEngine;
namespace Stary.Evo.Editor
{
public class CreatAssetWindow : OdinEditorWindow
{
[MenuItem("Evo/创建Domain作用域")]
static void Init()
{
// Get existing open window or if none, make a new one:
CreatAssetWindow window = (CreatAssetWindow)EditorWindow.GetWindow(typeof(CreatAssetWindow));
window.Show();
}
[TitleGroup("创建Domain作用域")] public string domain;
[TitleGroup("创建Domain作用域")]
[Button("创建Domain", ButtonSizes.Large)]
public async void CreatDomain()
{
if (GetCreatDomainAll().Count>0)
{
EditorUtility.DisplayDialog("错误!", "Domain仅可以创建一个请在下方删除存在的Domain", "确定");
return;
}
if (string.IsNullOrEmpty(domain))
{
EditorUtility.DisplayDialog("错误!", "请输入将要创建Domain的编号", "确定");
return;
}
string domainPath = $"{Application.dataPath}/Domain/{domain}";
if (Directory.Exists(domainPath+"/AddressableRes/Config/DomainConfig.asset"))
{
EditorUtility.DisplayDialog("错误!", $"\"{domain}\"已经存在,无法创建", "确定");
return;
}
Directory.CreateDirectory(domainPath);
//美术资源存放文件夹
string resPath = $"{domainPath}/AddressableRes";
Directory.CreateDirectory(resPath);
//创建音频文件夹
Directory.CreateDirectory(resPath + "/Audios");
//创建Config文件夹
Directory.CreateDirectory(resPath + "/Config");
//创建Dll文件夹
Directory.CreateDirectory(resPath + "/Dll");
//创建Prefabs文件夹
Directory.CreateDirectory(resPath + "/Prefabs");
//创建Scenes文件夹
Directory.CreateDirectory(resPath + "/Scenes");
//创建SpriteAtlas文件夹
Directory.CreateDirectory(resPath + "/SpriteAtlas");
//创建Sprites文件夹
Directory.CreateDirectory(resPath + "/Sprites");
//创建Video文件夹
Directory.CreateDirectory(resPath + "/Video");
await File.WriteAllTextAsync($"{resPath}/这里放所有参与热更的资源.hint", "");
//主入口预制件
GameObject gameObj = new GameObject(domain);
gameObj.transform.position = Vector3.zero;
gameObj.transform.rotation = Quaternion.identity;
gameObj.name = domain;
Directory.CreateDirectory($"{resPath}/Prefabs");
string rootPfbFilePath = $"Assets/Domain/{domain}/AddressableRes/Prefabs/{domain}.prefab";
var localPath = AssetDatabase.GenerateUniqueAssetPath(rootPfbFilePath);
PrefabUtility.SaveAsPrefabAsset(gameObj, localPath);
//存放脚本文件夹
string scriptsPath = $"{domainPath}/HotUpdate";
Directory.CreateDirectory(scriptsPath);
await File.WriteAllTextAsync($"{scriptsPath}/这里放所有参与热更的脚本文件.hint", "该文件夹中的程序集定义文件,请勿删除,非常重要。");
//创建配置文件夹
string confPath = $"{domainPath}/Conf";
Directory.CreateDirectory(confPath);
//程序集配置资源
string hotfixDomain = $"HotUpdate_{domain}";
string hotfixDomainAsmdef = $"{scriptsPath}/{hotfixDomain}.asmdef";
await using (var writer = new StreamWriter(hotfixDomainAsmdef))
{
string body = Resources.Load<TextAsset>("AssemblyDefinitionTemplate").text;
body = body.Replace("MODULE_IDENT", hotfixDomain);
body = body.Replace("ROOT_NAMESPACE", hotfixDomain);
await writer.WriteAsync(body);
}
// await File.WriteAllTextAsync($"{scriptsPath}/{hotfixDomain}.asmdef", body);
// string architectureClassName = $"{domain}Architecture";
// string architectureClassPath = $"{scriptsPath}/{architectureClassName}.txt";
// //await File.WriteAllTextAsync($"{scriptsPath}/{architectureClassName}.cs", architectureTemplate);
//
// await using (var writer = new StreamWriter(architectureClassPath))
// {
//
// string architectureTemplate = Resources.Load<TextAsset>("ArchitectureTemplate").text;
// architectureTemplate = architectureTemplate.Replace("XXXX", architectureClassName);
// await writer.WriteAsync(architectureTemplate);
// }
//模块化脚本生成配置
string domainClassName = $"{domain}Domain";
string architectureClassName = $"{domain}Architecture";
//模块配置资源
DomainConfig moduleConfig = CreateInstance<DomainConfig>();
moduleConfig.domain = domain;
moduleConfig.className = domainClassName;
moduleConfig.mainPrefab = "Prefabs_" + gameObj.name;
moduleConfig.@namespace = domain;
AssetDatabase.CreateAsset(moduleConfig, $"Assets/Domain/{domain}/AddressableRes/Config/DomainConfig.asset");
//
//模块服务器配置资源
HotfixMainResDomain hotfixMainResDomain = CreateInstance<HotfixMainResDomain>();
hotfixMainResDomain.hotfixMainResDomainEntity = new HotfixMainResDomainEntity();
hotfixMainResDomain.hotfixMainResDomainEntity.domain = domain;
AssetDatabase.CreateAsset(hotfixMainResDomain, $"Assets/Domain/{domain}/Conf/HotfixMainResDomain.asset");
//编辑器配置资源
BuildAssetDataSetting buildAssetDataSetting = CreateInstance<BuildAssetDataSetting>();
buildAssetDataSetting.packageName = domain;
AssetDatabase.CreateAsset(buildAssetDataSetting,
$"Assets/Domain/{domain}/Conf/BuildAssetDataSetting.asset");
AssetDatabase.Refresh();
string configPath = $"Assets/Domain/{domain}/HotUpdate/{hotfixDomain}.asmdef";
AssemblyDefinitionAsset assemblyDefinitionAsset =
AssetDatabase.LoadAssetAtPath<AssemblyDefinitionAsset>(configPath);
// 将程序集定义添加到 HybridCLR 热更列表
var settings = SettingsUtil.HybridCLRSettings;
if (!settings.hotUpdateAssemblyDefinitions.Contains(assemblyDefinitionAsset))
{
var assemblyList = settings.hotUpdateAssemblyDefinitions.ToList();
assemblyList.Add(assemblyDefinitionAsset);
SettingsUtil.HybridCLRSettings.hotUpdateAssemblyDefinitions = assemblyList.ToArray();
}
List<AssemblyDefinitionAsset> assemblies = new List<AssemblyDefinitionAsset>();
for (int i = 0; i < settings.hotUpdateAssemblyDefinitions.Length; i++)
{
if (settings.hotUpdateAssemblyDefinitions[i] != null)
{
assemblies.Add(settings.hotUpdateAssemblyDefinitions[i]);
}
}
HybridCLRSettings.Instance.hotUpdateAssemblyDefinitions = assemblies.ToArray();
HybridCLRSettings.Save();
AssetDatabase.SaveAssets();
string domainClassPath = $"{scriptsPath}/{domainClassName}.cs";
//await File.WriteAllTextAsync($"{scriptsPath}/{domainClassName}.cs", domainTemplate);
await using (var writer = new StreamWriter(domainClassPath))
{
string domainTemplate = Resources.Load<TextAsset>("DomainTemplate").text;
domainTemplate = domainTemplate.Replace("ClassNameXX", domainClassName)
.Replace("ReturnArchitecture", architectureClassName)
.Replace("ArchitectureX", architectureClassName)
.Replace("NamespaceX", domain);
await writer.WriteAsync(domainTemplate);
}
}
public void CreateDomainClass()
{
}
public void CreateArchitectureClass()
{
}
[TitleGroup("预览Domain作用域")] public List<CreatDomainEntity> domainList;
protected override void Initialize()
{
base.Initialize();
domainList = GetCreatDomainAll();
}
/// <summary>
/// 获取全部作用域
/// </summary>
public static string[] GetCreatDomainAllName()
{
string domainPath = $"{Application.dataPath}/Domain";
string[] domains;
// 新增目录获取代码
if (Directory.Exists(domainPath))
{
var dirInfo = new DirectoryInfo(domainPath);
// 获取直接子目录(不递归)
domains = dirInfo.GetDirectories("*", SearchOption.TopDirectoryOnly)
.Select(d => d.Name)
.ToArray();
}
else
{
domains = Array.Empty<string>();
}
return domains;
}
/// <summary>
/// 获取全部作用域
/// </summary>
public static List<CreatDomainEntity> GetCreatDomainAll()
{
string domainPath = $"{Application.dataPath}/Domain";
string[] domains;
// 新增目录获取代码
if (Directory.Exists(domainPath))
{
var dirInfo = new DirectoryInfo(domainPath);
// 获取直接子目录(不递归)
domains = dirInfo.GetDirectories("*", SearchOption.TopDirectoryOnly)
.Select(d => d.Name)
.ToArray();
}
else
{
domains = Array.Empty<string>();
}
List<CreatDomainEntity> domainList = new List<CreatDomainEntity>();
foreach (var item in domains)
{
if (File.Exists($"{domainPath}/{item}/AddressableRes/Config/DomainConfig.asset"))
{
CreatDomainEntity domainEntity = new CreatDomainEntity(domainList)
{
DomainName = item,
domainPath = $"{domainPath}/{item}"
};
domainList.Add(domainEntity);
}
}
return domainList;
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 7d162e11fd4c47ee9f6995ad7bb6bac1
timeCreated: 1742377890

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 7380165adc3342dbacef4abe80ac2bb7
timeCreated: 1742867444

View File

@@ -0,0 +1,39 @@
using System;
using System.Collections.Generic;
using System.IO;
using EditorFramework;
using Sirenix.OdinInspector;
using UnityEditor;
namespace Stary.Evo.Editor
{
[Serializable]
public class CreatDomainEntity
{
private List<CreatDomainEntity> domainList;
[HorizontalGroup] [ReadOnly] public string DomainName;
[ReadOnly]
public string domainPath;
public CreatDomainEntity(List<CreatDomainEntity> domainList)
{
this.domainList = domainList;
}
[HorizontalGroup(Width = 60)]
[Button("", Icon = SdfIconType.XCircle, IconAlignment = IconAlignment.RightEdge)]
public void CloseDomain()
{
bool isOk = EditorUtility.DisplayDialog("提示", "是否删除此Domain", "是", "否");
if (isOk)
{
BuildAssetWindow.RemoveBuildAssetWindow();
EditorFrameworkUtils.DeleteAllChild(domainPath, FileAttributes.Normal);
domainList.Clear();
AssetDatabase.Refresh();
AssetDatabase.SaveAssets();
}
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: b99d72d55efd48e099adf77d4608689d
timeCreated: 1742867433

View File

@@ -0,0 +1,142 @@
using System;
using System.Collections.Generic;
using Sirenix.OdinInspector;
using Stary.Evo.Editor;
using UnityEditor;
using UnityEngine;
using YooAsset;
using YooAsset.Editor;
namespace Stary.Evo.Editor
{
[Serializable]
public class AbstractBuildPipelineViewer
{
protected BuildAssetDataSetting dataSetting;
protected bool isSimulate;
protected bool isRaw;
[Title("清理构建缓存", titleAlignment: TitleAlignments.Centered)]
[HorizontalGroup("BuildCache")]
[InfoBox("当不勾选此项的时候,引擎会开启增量打包模式,会极大提高构建速度!")]
[OnValueChanged("SetBuildCacheToggle")]
[HideIf("isSimulate", true)]
public bool clearBuildCacheToggle;
[Title("依赖数据库", titleAlignment: TitleAlignments.Centered)]
[HorizontalGroup("BuildCache")]
[InfoBox("当开启此项的时候,会极大提高构建速度!")]
[OnValueChanged("SetUseAssetDependencyDB")]
[HideIf("isSimulate", true)]
public bool useAssetDependencyDBToggle;
[Title("资源包的压缩方式", titleAlignment: TitleAlignments.Centered)]
[HorizontalGroup("FileStyle"), HideLabel]
[OnValueChanged("SetCompression")]
[HideIf("@isSimulate==true || isRaw==true")]
public ECompressOption compression;
[Title("资源包文件名称样式", titleAlignment: TitleAlignments.Centered)]
[HorizontalGroup("FileStyle"), HideLabel]
[OnValueChanged("SetFileNameStyle")]
[HideIf("isSimulate", true)]
public EFileNameStyle fileNameStyle;
[Title("首包资源文件的拷贝方式", titleAlignment: TitleAlignments.Centered)]
[HorizontalGroup("FileStyle"), HideLabel]
[OnValueChanged("SetCopyBuildinFileOption")]
[HideIf("isSimulate", true)]
public EBuildinFileCopyOption copyBuildinFileOption;
[Title("首包资源文件的拷贝参数", titleAlignment: TitleAlignments.Centered)]
[HideLabel]
[OnValueChanged("SetCopyBuildinFileParams")]
[ShowIf(
"@copyBuildinFileOption==EBuildinFileCopyOption.ClearAndCopyByTags||copyBuildinFileOption==EBuildinFileCopyOption.OnlyCopyByTags ")]
public string copyBuildinFileParams;
public AbstractBuildPipelineViewer(BuildAssetDataSetting dataSetting)
{
this.dataSetting = dataSetting;
useAssetDependencyDBToggle = true;
clearBuildCacheToggle = false;
compression = ECompressOption.LZ4;
fileNameStyle = EFileNameStyle.BundleName;
copyBuildinFileOption = EBuildinFileCopyOption.ClearAndCopyAll;
}
#region AssetBuild
private void SetCompression()
{
AssetBundleBuilderSetting.SetPackageCompressOption(dataSetting.packageName, dataSetting.selectedBuildPipelines,
compression);
}
private void SetFileNameStyle()
{
AssetBundleBuilderSetting.SetPackageFileNameStyle(dataSetting.packageName, dataSetting.selectedBuildPipelines,
fileNameStyle);
}
private void SetCopyBuildinFileOption()
{
AssetBundleBuilderSetting.SetPackageBuildinFileCopyOption(dataSetting.packageName,
dataSetting.selectedBuildPipelines, copyBuildinFileOption);
//PlayerPrefs.SetInt("CopyBuildinFileOption", (int)copyBuildinFileOption);
}
private void SetCopyBuildinFileParams()
{
AssetBundleBuilderSetting.SetPackageBuildinFileCopyParams(dataSetting.packageName,
dataSetting.selectedBuildPipelines, copyBuildinFileParams);
//PlayerPrefs.SetInt("CopyBuildinFileOption", (int)copyBuildinFileOption);
}
public void SetBuildCacheToggle()
{
AssetBundleBuilderSetting.SetPackageClearBuildCache(dataSetting.packageName, dataSetting.selectedBuildPipelines,
clearBuildCacheToggle);
}
private void SetUseAssetDependencyDB()
{
AssetBundleBuilderSetting.SetPackageUseAssetDependencyDB(dataSetting.packageName, dataSetting.selectedBuildPipelines,
useAssetDependencyDBToggle);
}
#endregion
public virtual void ExecuteBuild()
{
// GetPackageVersion();
}
/// <summary>
/// 创建加密类实例
/// </summary>
protected IEncryptionServices CreateEncryptionInstance()
{
var encyptionClassName =
AssetBundleBuilderSetting.GetPackageEncyptionClassName(dataSetting.packageName,
dataSetting.selectedBuildPipelines);
var encryptionClassTypes = EditorTools.GetAssignableTypes(typeof(IEncryptionServices));
var classType = encryptionClassTypes.Find(x => x.FullName.Equals(encyptionClassName));
if (classType != null)
return (IEncryptionServices)Activator.CreateInstance(classType);
else
return null;
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 7fdaadaf963047a098c8b4f46fec5619
timeCreated: 1741835014

View File

@@ -0,0 +1,48 @@
using System;
using UnityEditor;
using YooAsset;
using YooAsset.Editor;
namespace Stary.Evo.Editor
{
[Serializable]
public class RawfileBuildpipelineViewer:AbstractBuildPipelineViewer
{
public RawfileBuildpipelineViewer(BuildAssetDataSetting packageName) : base(packageName)
{
isRaw = true;
}
public override void ExecuteBuild()
{
var fileNameStyle = AssetBundleBuilderSetting.GetPackageFileNameStyle(dataSetting.packageName, dataSetting.selectedBuildPipelines);
var buildinFileCopyOption = AssetBundleBuilderSetting.GetPackageBuildinFileCopyOption(dataSetting.packageName, dataSetting.selectedBuildPipelines);
var buildinFileCopyParams = AssetBundleBuilderSetting.GetPackageBuildinFileCopyParams(dataSetting.packageName, dataSetting.selectedBuildPipelines);
var clearBuildCache = AssetBundleBuilderSetting.GetPackageClearBuildCache(dataSetting.packageName, dataSetting.selectedBuildPipelines);
var useAssetDependencyDB = AssetBundleBuilderSetting.GetPackageUseAssetDependencyDB(dataSetting.packageName, dataSetting.selectedBuildPipelines);
RawFileBuildParameters buildParameters = new RawFileBuildParameters();
buildParameters.BuildOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot();
buildParameters.BuildinFileRoot = AssetBundleBuilderHelper.GetStreamingAssetsRoot();
buildParameters.BuildPipeline = dataSetting.selectedBuildPipelines.ToString();
buildParameters.BuildBundleType = (int)EBuildBundleType.RawBundle;
buildParameters.BuildTarget = EditorUserBuildSettings.activeBuildTarget;
buildParameters.PackageName = dataSetting.packageName;
buildParameters.PackageVersion =dataSetting.GetBuildPackageVersion();
buildParameters.VerifyBuildingResult = true;
buildParameters.FileNameStyle = fileNameStyle;
buildParameters.BuildinFileCopyOption = buildinFileCopyOption;
buildParameters.BuildinFileCopyParams = buildinFileCopyParams;
buildParameters.ClearBuildCacheFiles = clearBuildCache;
buildParameters.UseAssetDependencyDB = useAssetDependencyDB;
buildParameters.EncryptionServices = CreateEncryptionInstance();
RawFileBuildPipeline pipeline = new RawFileBuildPipeline();
var buildResult = pipeline.Run(buildParameters, true);
if (buildResult.Success)
EditorUtility.RevealInFinder(buildResult.OutputPackageDirectory);
base.ExecuteBuild();
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 06dda5f218054dee83d2a37d42bb2b9a
timeCreated: 1741830326

View File

@@ -0,0 +1,62 @@
using System;
using UnityEditor;
using YooAsset;
using YooAsset.Editor;
namespace Stary.Evo.Editor
{
[Serializable]
public class ScriptableBuildPipelineViewer:AbstractBuildPipelineViewer
{
public ScriptableBuildPipelineViewer(BuildAssetDataSetting packageName) : base(packageName)
{
}
public override void ExecuteBuild()
{
var fileNameStyle = AssetBundleBuilderSetting.GetPackageFileNameStyle(dataSetting.packageName, dataSetting.selectedBuildPipelines);
var buildinFileCopyOption = AssetBundleBuilderSetting.GetPackageBuildinFileCopyOption(dataSetting.packageName, dataSetting.selectedBuildPipelines);
var buildinFileCopyParams = AssetBundleBuilderSetting.GetPackageBuildinFileCopyParams(dataSetting.packageName, dataSetting.selectedBuildPipelines);
var compressOption = AssetBundleBuilderSetting.GetPackageCompressOption(dataSetting.packageName, dataSetting.selectedBuildPipelines);
var clearBuildCache = AssetBundleBuilderSetting.GetPackageClearBuildCache(dataSetting.packageName, dataSetting.selectedBuildPipelines);
var useAssetDependencyDB = AssetBundleBuilderSetting.GetPackageUseAssetDependencyDB(dataSetting.packageName, dataSetting.selectedBuildPipelines);
var builtinShaderBundleName = GetBuiltinShaderBundleName();
ScriptableBuildParameters buildParameters = new ScriptableBuildParameters();
buildParameters.BuildOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot();
buildParameters.BuildinFileRoot = AssetBundleBuilderHelper.GetStreamingAssetsRoot();
buildParameters.BuildPipeline = dataSetting.selectedBuildPipelines.ToString();
buildParameters.BuildBundleType = (int)EBuildBundleType.AssetBundle;
buildParameters.BuildTarget = EditorUserBuildSettings.activeBuildTarget;
buildParameters.PackageName = dataSetting.packageName;
buildParameters.PackageVersion = dataSetting.GetBuildPackageVersion();
buildParameters.EnableSharePackRule = true;
buildParameters.VerifyBuildingResult = true;
buildParameters.FileNameStyle = fileNameStyle;
buildParameters.BuildinFileCopyOption = buildinFileCopyOption;
buildParameters.BuildinFileCopyParams = buildinFileCopyParams;
buildParameters.CompressOption = compressOption;
buildParameters.ClearBuildCacheFiles = clearBuildCache;
buildParameters.UseAssetDependencyDB = useAssetDependencyDB;
buildParameters.BuiltinShadersBundleName = builtinShaderBundleName;
buildParameters.EncryptionServices = CreateEncryptionInstance();
ScriptableBuildPipeline pipeline = new ScriptableBuildPipeline();
var buildResult = pipeline.Run(buildParameters, true);
if (buildResult.Success)
EditorUtility.RevealInFinder(buildResult.OutputPackageDirectory);
base.ExecuteBuild();
}
/// <summary>
/// 内置着色器资源包名称
/// 注意:和自动收集的着色器资源包名保持一致!
/// </summary>
private string GetBuiltinShaderBundleName()
{
var uniqueBundleName = AssetBundleCollectorSettingData.Setting.UniqueBundleName;
var packRuleResult = DefaultPackRule.CreateShadersPackRuleResult();
return packRuleResult.GetBundleName(dataSetting.packageName, uniqueBundleName);
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: cb4c30ccb8294c92a7545fc05377d7bc
timeCreated: 1741830341

View File

@@ -0,0 +1,42 @@
using System;
using UnityEditor;
using YooAsset;
using YooAsset.Editor;
namespace Stary.Evo.Editor
{
[Serializable]
public class SimulateBuildPipelineViewer:AbstractBuildPipelineViewer
{
public SimulateBuildPipelineViewer(BuildAssetDataSetting packageName) : base(packageName)
{
isSimulate = true;
}
public override void ExecuteBuild()
{
var fileNameStyle = AssetBundleBuilderSetting.GetPackageFileNameStyle(dataSetting.packageName, dataSetting.selectedBuildPipelines);
var buildinFileCopyOption = AssetBundleBuilderSetting.GetPackageBuildinFileCopyOption(dataSetting.packageName, dataSetting.selectedBuildPipelines);
var buildinFileCopyParams = AssetBundleBuilderSetting.GetPackageBuildinFileCopyParams(dataSetting.packageName, dataSetting.selectedBuildPipelines);
EditorSimulateBuildParameters buildParameters = new EditorSimulateBuildParameters();
buildParameters.BuildOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot();
buildParameters.BuildinFileRoot = AssetBundleBuilderHelper.GetStreamingAssetsRoot();
buildParameters.BuildPipeline = dataSetting.selectedBuildPipelines.ToString();
buildParameters.BuildBundleType = (int)EBuildBundleType.VirtualBundle;
buildParameters.BuildTarget = EditorUserBuildSettings.activeBuildTarget;
buildParameters.PackageName = dataSetting.packageName;
buildParameters.PackageVersion = dataSetting.GetBuildPackageVersion();
buildParameters.VerifyBuildingResult = true;
buildParameters.FileNameStyle = fileNameStyle;
buildParameters.BuildinFileCopyOption = buildinFileCopyOption;
buildParameters.BuildinFileCopyParams = buildinFileCopyParams;
buildParameters.EncryptionServices = CreateEncryptionInstance();
EditorSimulateBuildPipeline pipeline = new EditorSimulateBuildPipeline();
var buildResult = pipeline.Run(buildParameters, true);
if (buildResult.Success)
EditorUtility.RevealInFinder(buildResult.OutputPackageDirectory);
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 501ea11982da4673b0bf8af90a805329
timeCreated: 1741830160