From cdd5eafa64f35c3bcef07e4dd78207940ab32303 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E9=93=AE?= <834207172@qq.com> Date: Fri, 24 Oct 2025 11:11:59 +0800 Subject: [PATCH] 111 --- Assets/00.StaryEvo/Editor/ArtBuild.meta | 3 + .../Editor/ArtBuild/BuildArtAssetWindow.cs | 580 ++++++++++++++++++ .../ArtBuild/BuildArtAssetWindow.cs.meta | 3 + .../Editor/ArtBuild/CreatArtAssetWindow.cs | 374 +++++++++++ .../ArtBuild/CreatArtAssetWindow.cs.meta | 3 + .../Editor/Build/AutoBuildPackage.cs | 7 +- .../Editor/Build/BuildApkWindow.cs | 2 +- .../BuildAsset/BuildAssetDataSetting.cs | 12 +- .../Editor/BuildAsset/BuildAssetWindow.cs | 34 +- .../BuildAsset/BuiltinBuildPipelineViewer.cs | 32 +- .../Editor/BuildAsset/CreatAssetWindow.cs | 2 +- .../BuildAsset/Entity/CreatArtDomainEntity.cs | 61 ++ .../Entity/CreatArtDomainEntity.cs.meta | 3 + .../Editor/BuildAsset/IBuildPipelineViewer.cs | 55 +- .../Editor/BuildAsset/OneKeyBuildWindow.cs | 2 +- .../BuildAsset/RawfileBuildpipelineViewer.cs | 19 +- .../ScriptableBuildPipelineViewer.cs | 23 +- .../BuildAsset/SimulateBuildPipelineViewer.cs | 14 +- .../Editor/MarkAdressable/MarkAdressable.cs | 99 ++- Assets/00.StaryEvo/Editor/Type.meta | 3 + Assets/00.StaryEvo/Editor/Type/BuildType.cs | 8 + .../00.StaryEvo/Editor/Type/BuildType.cs.meta | 3 + Assets/00.StaryEvo/package.json | 2 +- .../Runtime/HybridLoad/Base/AppConfig.cs | 2 +- .../Runtime/HybridLoad/Fsm/LoadResState.cs | 88 +-- .../Runtime/HybridLoad/Fsm/ResStartState.cs | 12 +- .../Runtime/HybridLoad/HybridClREntrance.cs | 30 +- Assets/00.StaryEvoTools/package.json | 2 +- 28 files changed, 1316 insertions(+), 162 deletions(-) create mode 100644 Assets/00.StaryEvo/Editor/ArtBuild.meta create mode 100644 Assets/00.StaryEvo/Editor/ArtBuild/BuildArtAssetWindow.cs create mode 100644 Assets/00.StaryEvo/Editor/ArtBuild/BuildArtAssetWindow.cs.meta create mode 100644 Assets/00.StaryEvo/Editor/ArtBuild/CreatArtAssetWindow.cs create mode 100644 Assets/00.StaryEvo/Editor/ArtBuild/CreatArtAssetWindow.cs.meta create mode 100644 Assets/00.StaryEvo/Editor/BuildAsset/Entity/CreatArtDomainEntity.cs create mode 100644 Assets/00.StaryEvo/Editor/BuildAsset/Entity/CreatArtDomainEntity.cs.meta create mode 100644 Assets/00.StaryEvo/Editor/Type.meta create mode 100644 Assets/00.StaryEvo/Editor/Type/BuildType.cs create mode 100644 Assets/00.StaryEvo/Editor/Type/BuildType.cs.meta diff --git a/Assets/00.StaryEvo/Editor/ArtBuild.meta b/Assets/00.StaryEvo/Editor/ArtBuild.meta new file mode 100644 index 0000000..4fdcdb3 --- /dev/null +++ b/Assets/00.StaryEvo/Editor/ArtBuild.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f227eb3ecaea4ee9a398278ff8da4092 +timeCreated: 1761189727 \ No newline at end of file diff --git a/Assets/00.StaryEvo/Editor/ArtBuild/BuildArtAssetWindow.cs b/Assets/00.StaryEvo/Editor/ArtBuild/BuildArtAssetWindow.cs new file mode 100644 index 0000000..b865a10 --- /dev/null +++ b/Assets/00.StaryEvo/Editor/ArtBuild/BuildArtAssetWindow.cs @@ -0,0 +1,580 @@ +/**************************************************** + 文件:BuildAssetWindow.cs + 作者:xosmo_ + 邮箱: + 日期:2025/3/10 10:43:20 + 功能: +*****************************************************/ + +using System; +using System.Collections.Generic; +using System.IO; +using System.IO.Compression; +using System.Threading.Tasks; +#if HotUpdate +using HybridCLR.Editor; +using HybridCLR.Editor.Commands; +#endif +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Sirenix.OdinInspector; +using Sirenix.OdinInspector.Editor; +using UnityEditor; +using UnityEngine; +using YooAsset; +using YooAsset.Editor; + +namespace Stary.Evo.Editor +{ + public class BuildAssetWindow : OdinEditorWindow + { + public static OdinEditorWindow window; + private HotfixMainResDomain hotfixMainResDomain; + + [MenuItem("Evo/Art资源打包工具")] + static void ShowWindows() + { + + if (CreatAssetWindow.GetCreatDomainAll().Count <= 0) + { + EditorUtility.DisplayDialog("提示", "不存在Domain元素,无法打开此面板,请先创建Domain元素", "确定"); + return; + } + + window = (BuildAssetWindow)EditorWindow.GetWindow(typeof(BuildAssetWindow)); + window.Show(); + } + + protected override void OnDisable() + { + base.OnDisable(); + EditorUtility.ClearProgressBar(); + } + + protected override async void Initialize() + { + base.Initialize(); + GetBuildPackageNames(); + //初始化读取资源配置表 + hotfixMainResDomain = Resources.Load("HotfixMainResDomain"); + if (hotfixMainResDomain == null) + { + Debug.LogError($"UnityEvo:读取资源配置表失败【HotfixMainResDomain】...表在Resources下不存在,请创建"); + } + else + { + ip = hotfixMainResDomain.hotfixMainResDomainEntity.ipconfig; + EditorPrefs.SetString("ip",ip); + userName = hotfixMainResDomain.hotfixMainResDomainEntity.username; + password = hotfixMainResDomain.hotfixMainResDomainEntity.password; + } + + if (string.IsNullOrEmpty(ip)) + { + buildAssetType = BuildAssetType.Login; + return; + } + + bool isValidateToken = await WebRequestSystem.GetValidateToken(ip + "/Authentication/validateToken"); + if (isValidateToken) + { + buildAssetType = BuildAssetType.Build; + return; + } + + + buildAssetType = BuildAssetType.Login; + } + + public static void RemoveBuildAssetWindow() + { + if (window != null) + window.Close(); + } + + [EnumToggleButtons, HideLabel] public BuildAssetType buildAssetType; + + #region BuildAssetLogin + + [ShowIf("@ buildAssetType== BuildAssetType.Login")] + [BoxGroup("Login", showLabel: false)] + [OnValueChanged("SetWebRequestInfo")] + public string ip, userName, password; + + [ShowIf("@ buildAssetType== BuildAssetType.Login")] + [BoxGroup("Login", showLabel: false)] + [Button("登录", ButtonSizes.Large)] + [InfoBox("@ message", InfoMessageType.Info)] + public async void LoginButton() + { + string url = ip + "/Authentication/login"; + EditorUtility.DisplayProgressBar("提示", $"登陆中~", 0f); + bool islogin = await WebRequestSystem.Login(url, userName, password); + float progress = 0f; + while (progress >= 1f) + { + progress += 0.1f; + EditorUtility.DisplayProgressBar("提示", $"登陆中~", progress); + await Task.Delay(TimeSpan.FromSeconds(0.2f)); + } + + EditorUtility.ClearProgressBar(); + UpdateMessage(islogin); + } + + private void SetWebRequestInfo() + { + if (hotfixMainResDomain != null) + { + hotfixMainResDomain.hotfixMainResDomainEntity.ipconfig = ip; + hotfixMainResDomain.hotfixMainResDomainEntity.username = userName; + hotfixMainResDomain.hotfixMainResDomainEntity.password = password; + EditorPrefs.SetString("ip",ip); + EditorUtility.SetDirty(hotfixMainResDomain); + AssetDatabase.SaveAssets(); + } + } + + private string message; + + public void UpdateMessage(bool islogin) + { + message = "当前登录状态为:" + islogin; + if (islogin) + { + buildAssetType = BuildAssetType.Build; + } + } + + #endregion + + protected void OnSelectionChange() + { + EditorUtility.SetDirty(BuildAssetDataSetting); + AssetDatabase.SaveAssets(); + //AssetDatabase.Refresh(); + } + + [BoxGroup("Build", showLabel: false)] + [ShowIf("@ buildAssetType== BuildAssetType.Build")] + [Title("包裹列表", titleAlignment: TitleAlignments.Centered)] + [HorizontalGroup("Build/BuildPipeline"), HideLabel] + [ValueDropdown("GetBuildPackageNames")] + [OnValueChanged("SetBuildPackageNames")] + public string selectedPackageNames; + + [BoxGroup("Build", showLabel: false)] + [ShowIf("@ buildAssetType== BuildAssetType.Build")] + [Title("当前打包平台", titleAlignment: TitleAlignments.Centered)] + [ReadOnly] + [HorizontalGroup("Build/BuildPipeline"), HideLabel] + public string buildTarget; + + public static string packageName; + + #region HyBridCLRBuild + + [BoxGroup("Build", showLabel: false)] + [HideIf("@ buildAssetType!= BuildAssetType.Build")] + [Title("打包dll(子包仅打一次)", titleAlignment: TitleAlignments.Centered)] + [HorizontalGroup("Build/HyBridClrBuildEntity"), HideLabel] + public BuildAssetEntity hyBridClrBuildEntity = + new BuildAssetEntity("HyBridCLRBuild", "DllBuildTarget", () => + { +#if HotUpdate + //PrebuildCommand.GenerateAll(); + CompileDllCommand.CompileDllActiveBuildTarget(); +#endif + }); + + #endregion + + + #region MarkAsset + + [BoxGroup("Build", showLabel: false)] + [ShowIf("@ buildAssetType== BuildAssetType.Build")] + [Title("标记资源", titleAlignment: TitleAlignments.Centered)] + [HorizontalGroup("Build/HyBridClrBuildEntity"), HideLabel] + public BuildAssetEntity markAssetEntity = + new BuildAssetEntity("MarkAsset", "MarkAsset", MarkAdressable.AddMark); + + #endregion + + #region BuildAsset + + [BoxGroup("Build", showLabel: false)] + [ShowIf("@ buildAssetType== BuildAssetType.Build")] + [InlineEditor(InlineEditorObjectFieldModes.CompletelyHidden)] + [HideLabel] + public BuildAssetDataSetting BuildAssetDataSetting; + + /// + /// 检测当前所有包裹 + /// + /// + private List GetBuildPackageNames() + { + List result = new List(); + 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; + } + + /// + /// 设置当前包裹 + /// + /// + private void SetBuildPackageNames() + { + //PlayerPrefs.SetString("BuildPackageNames", selectedPackageNames); + // DataSetting.packageName = selectedPackageNames; + + + // DataSetting = Resources.Load("BuildAssetDataSetting"); + string buildAssetDataSettingPath = + $"Assets/Domain/{selectedPackageNames}/Conf/BuildAssetDataSetting.asset"; + BuildAssetDataSetting buildAssetDataSetting = + AssetDatabase.LoadAssetAtPath(buildAssetDataSettingPath); + if (buildAssetDataSetting != null) + { + BuildAssetDataSetting = buildAssetDataSetting; + Init(); + } + else + { + Debug.LogError($"UnityEvo:BuildAssetDataSetting 不存在,请检查路径{buildAssetDataSettingPath}"); + } + + if (selectedPackageNames != packageName) + { + GetHostBuildPackageVersion(buildAssetDataSetting); + } + + packageName = selectedPackageNames; + } + + /// + /// 获取当前包裹 + /// + /// + public static string GetBuildPackageName() + { + return packageName; + } + + #endregion + + #region Update + + [BoxGroup("Build", showLabel: false)] + [ShowIf("@ buildAssetType== BuildAssetType.Build")] + [Title("打包本地资源", titleAlignment: TitleAlignments.Centered)] + [HideLabel] + public BuildAssetEntity onBuildPipelineEntity; + + [BoxGroup("Build", showLabel: false)] + [Title("上传资源", titleAlignment: TitleAlignments.Centered)] + [HideLabel] + [ShowIf( + "@ BuildAssetDataSetting.environmentType== EnvironmentType.Release && buildAssetType== BuildAssetType.Build")] + public BuildAssetEntity onUpdateBuildPipelineEntity; + + + private void OnBuildPipeline() + { + if (EditorUtility.DisplayDialog("提示", $"开始构建资源包[{selectedPackageNames}]!", "Yes", "No")) + { + EditorTools.ClearUnityConsole(); + EditorApplication.delayCall += BuildAssetDataSetting.viewer.ExecuteBuild; + } + else + { + Debug.LogWarning("[Build] 打包已经取消"); + } + } + + private async void OnUpdateBuildPipeline() + { + if (EditorUtility.DisplayDialog("提示", $"开始上传至服务器[{selectedPackageNames}]!", "Yes", "No")) + { + // 新增:打包为zip的逻辑 + string zipFilePath = BuildZip(BuildAssetDataSetting); + await UpdateFileDataResDomain(BuildAssetDataSetting, zipFilePath); + await Task.Delay(1000); + EditorUtility.ClearProgressBar(); + } + else + { + EditorUtility.ClearProgressBar(); + EditorUtility.DisplayDialog("提示", "Update] 上传已经取消", "确定"); + Debug.LogWarning("[Update] 上传已经取消"); + } + } + + + public static string BuildZip(BuildAssetDataSetting setting) + { + EditorUtility.DisplayProgressBar("提示", $"开始上传{setting.packageName}(打包zip)", 0.0f); + // 新增:打包为zip的逻辑 + string zipFileName = + $"{setting.packageName}_{setting.packageVersion}.zip"; + //原yooAsset目录 + var outputPackageDirectory = + $"{AssetBundleBuilderHelper.GetDefaultBuildOutputRoot()}/{EditorUserBuildSettings.activeBuildTarget}/{setting.packageName}"; + + //拷贝目录 + string outFilePath = $"{outputPackageDirectory}/{setting.packageVersion}"; + + var copyPackageDirectory = + $"{Application.streamingAssetsPath}/{YooAssetSettingsData.GetDefaultYooFolderName()}/{setting.packageName}"; + //拷贝BuildinCatalog文件 + CreateBuildinCatalogFile("BuildinCatalog.json", copyPackageDirectory, outFilePath); + CreateBuildinCatalogFile("BuildinCatalog.bytes", copyPackageDirectory, outFilePath); + + //输出目录 + string zipFilePath = Path.Combine(outputPackageDirectory, zipFileName); + try + { + using (FileStream zipStream = new FileStream(zipFilePath, FileMode.Create)) + using (ZipArchive archive = new ZipArchive(zipStream, ZipArchiveMode.Create)) + { + // 指定需要压缩的后缀(例如:只压缩.json和.dll文件) + //string[] targetExtensions = { ".bundle" }; + + // 遍历目录下所有文件 + // foreach (string filePath in Directory.GetFiles(outFilePath, "*.*", SearchOption.AllDirectories) + // .Where(f => targetExtensions.Contains(Path.GetExtension(f), + // StringComparer.OrdinalIgnoreCase))) + foreach (string filePath in Directory.GetFiles(outFilePath, "*.*", SearchOption.AllDirectories)) + { + // 获取文件在压缩包中的相对路径 + string entryName = Path.GetRelativePath(outFilePath, filePath); + + // 创建zip条目 + ZipArchiveEntry entry = archive.CreateEntry(entryName, + System.IO.Compression.CompressionLevel.Optimal); + + // 写入文件内容 + using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read)) + using (Stream entryStream = entry.Open()) + { + fileStream.CopyTo(entryStream); + } + } + } + + Debug.Log($"成功打包为zip:{zipFilePath}"); + EditorUtility.DisplayProgressBar("提示", $"开始上传{setting.packageName}(打包zip)", 0.25f); + return zipFilePath; + } + catch (Exception ex) + { + Debug.LogError($"打包zip失败:{ex.Message}"); + EditorUtility.ClearProgressBar(); + return default; + } + } + + private static void CreateBuildinCatalogFile(string fileName, string copyPackageDirectory, string outFilePath) + { + // 假设 BuildinCatalog 文件名为 BuildinCatalog.json + + string sourcePath = Path.Combine(copyPackageDirectory, fileName); // 源文件路径 + string destinationPath = Path.Combine(outFilePath, fileName); // 目标文件路径 + +// 如果目标文件已存在,则覆盖 + if (File.Exists(destinationPath)) + { + File.Delete(destinationPath); + } + +// 执行拷贝操作 + File.Copy(sourcePath, destinationPath); + + } + + public static async Task UpdateFileDataResDomain(BuildAssetDataSetting setting, string zipFilePath) + { + //初始化读取资源配置表 + HotfixMainResDomain hotfixMainResDomain = Resources.Load("HotfixMainResDomain"); + if (hotfixMainResDomain == null) + { + Debug.LogError($"UnityEvo:读取资源配置表失败【HotfixMainResDomain】...表不存在"); + return; + } + + var ip = hotfixMainResDomain.hotfixMainResDomainEntity.ipconfig; + var messageEntity = await WebRequestSystem.PostFile(ip + "/FileLoad/UpLoadFile", new[] { zipFilePath }); + EditorUtility.DisplayProgressBar("提示", $"开始上传{setting.packageName}(上传zip文件)", 0.5f); + if (messageEntity.code == 200) + { + List resultMessageEntities = + JsonConvert.DeserializeObject>(messageEntity.data.ToString()); + if (resultMessageEntities.Count > 0) + { + EditorUtility.DisplayProgressBar("提示", "开始上传(更新数据库)", 0.75f); + foreach (var resultMessageEntity in resultMessageEntities) + { + var data = JsonConvert.DeserializeObject(resultMessageEntity.data.ToString()) as JObject; + string fileId = data["id"].ToString(); + ResDmainAddRequst resDmainAddRequst = new ResDmainAddRequst() + { + ProductName = Application.identifier, + DomainName = setting.packageName, + Platform = EditorUserBuildSettings.activeBuildTarget.ToString(), + PackageVersion = setting.packageVersion, + DocumentFileId = fileId + }; + var resResultMessage = await WebRequestSystem.Post(ip + "/ResDomain/AddResDomain", + JsonConvert.SerializeObject(resDmainAddRequst)); + //如果低于服务器版本,更新版本号 + if (resResultMessage.code == 1009) + { + ResDmainVersionResponse dmainVersionResponse = + JsonConvert.DeserializeObject(resResultMessage.data + .ToString()); + string[] versions = dmainVersionResponse.PackageVersion.Split('.'); + setting.packageVersionX = int.Parse(versions[0]); + setting.packageVersionY = int.Parse(versions[1]); + setting.packageVersionZ = int.Parse(versions[2]); + EditorUtility.DisplayDialog("提示", + $"{resResultMessage.message + $"\n{resResultMessage.data.ToString()}"}", "确定"); + } + + setting.GetBuildPackageVersion(true); + } + + EditorUtility.DisplayProgressBar("提示", $"开始上传{setting.packageName}(更新数据库)", 1f); + } + } + else + { + EditorUtility.DisplayProgressBar("提示", $"{messageEntity.message}", 1f); + } + + await Task.Delay(1000); + EditorUtility.ClearProgressBar(); + return; + } + + /// + /// 获取服务器上版本号 + /// + private async void GetHostBuildPackageVersion(BuildAssetDataSetting setting) + { + var resDmainAddRequst = new ResDmainRequst() + { + ProductName = Application.identifier, + DomainName = selectedPackageNames, + Platform = EditorUserBuildSettings.activeBuildTarget.ToString(), + }; + var resResultMessage = await WebRequestSystem.Post(ip + "/ResDomain/GetResDomainByDomain", + JsonConvert.SerializeObject(resDmainAddRequst)); + //如果低于服务器版本,更新版本号 + if (resResultMessage.code != 1011) + { + if (resResultMessage.data != null) + { + ResDmainResponse domainResponse = + JsonConvert.DeserializeObject(resResultMessage.data + .ToString()); + string[] versions = domainResponse.PackageVersion.Split('.'); + setting.packageVersionX = int.Parse(versions[0]); + setting.packageVersionY = int.Parse(versions[1]); + setting.packageVersionZ = int.Parse(versions[2]); + setting.GetBuildPackageVersion(true); + } + else + { + Debug.LogError($"UnityEvo:获取服务器版本失败,resResultMessage.data为空"); + } + } + else + { + EditorUtility.DisplayDialog("提示", + $"{resResultMessage.message},默认1.0.0版本 ", "确定"); + setting.packageVersionX = 1; + setting.packageVersionY = 0; + setting.packageVersionZ = 0; + setting.GetBuildPackageVersion(false); + } + } + + #endregion + + protected void Init() + { + //Update + buildTarget = EditorUserBuildSettings.activeBuildTarget.ToString(); + 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); + } + GUILayout.EndScrollView(); + + BuildServerPath(); + UpdateBuildPipelineButtonName(); + } + + public void UpdateBuildPipelineButtonName() + { + onBuildPipelineEntity.SetButtonName($"打包资源包【版本:{BuildAssetDataSetting.packageVersion}】"); + onUpdateBuildPipelineEntity.SetButtonName($"更新至服务器【版本:{BuildAssetDataSetting.packageVersion}】"); + } + + /// + /// 生成服务器路径 + /// + 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}】"); + } + } + + public enum BuildAssetType + { + Login, + Build, + } +} \ No newline at end of file diff --git a/Assets/00.StaryEvo/Editor/ArtBuild/BuildArtAssetWindow.cs.meta b/Assets/00.StaryEvo/Editor/ArtBuild/BuildArtAssetWindow.cs.meta new file mode 100644 index 0000000..7cd9065 --- /dev/null +++ b/Assets/00.StaryEvo/Editor/ArtBuild/BuildArtAssetWindow.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: be7ec9bc4c8d40b0850b440246ea122f +timeCreated: 1761198971 \ No newline at end of file diff --git a/Assets/00.StaryEvo/Editor/ArtBuild/CreatArtAssetWindow.cs b/Assets/00.StaryEvo/Editor/ArtBuild/CreatArtAssetWindow.cs new file mode 100644 index 0000000..f05da11 --- /dev/null +++ b/Assets/00.StaryEvo/Editor/ArtBuild/CreatArtAssetWindow.cs @@ -0,0 +1,374 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +#if HotUpdate +using HybridCLR.Editor; +using HybridCLR.Editor.Settings; +#endif +using Sirenix.OdinInspector; +using Sirenix.OdinInspector.Editor; +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 artDomainPath = $"{Application.dataPath}/Art/{domain}"; + if (!Directory.Exists(artDomainPath)) + { + Directory.CreateDirectory(artDomainPath); + + if (!Directory.Exists(artDomainPath)) + //创建Animation文件夹 + CreatDirectory(artDomainPath + "/Animation"); + //创建Effects文件夹 + CreatDirectory(artDomainPath + "/Effects"); + //创建Fbx文件夹 + CreatDirectory(artDomainPath + "/Fbx"); + //创建Font文件夹 + CreatDirectory(artDomainPath + "/Font"); + //创建Materials文件夹 + CreatDirectory(artDomainPath + "/Materials"); + //创建Prefabs文件夹 + CreatDirectory(artDomainPath + "/Prefabs"); + //创建Scenes文件夹 + CreatDirectory(artDomainPath + "/Scenes"); + //创建/Scenes/Test文件夹 + CreatDirectory(artDomainPath + "/Scenes/Test"); + //创建Shader文件夹 + CreatDirectory(artDomainPath + "/Shader"); + //创建Textures文件夹 + CreatDirectory(artDomainPath + "/Textures"); + File.WriteAllTextAsync( + $"{artDomainPath}/这里放所有美术的资源,因涉及打包依赖等原因,不建议在上一层节点新增文件夹,如涉及文件夹规范等问题请@张铮.hint", ""); + } + //创建Art 测试场景 + /* 2. 再建 Scenes/Test */ + string sceneDir = $"{artDomainPath}/Scenes/Test"; + if (!Directory.Exists(sceneDir)) + { + Directory.CreateDirectory(sceneDir); + /* 3. 创建新场景 */ + var newScene = UnityEditor.SceneManagement.EditorSceneManager.NewScene( + UnityEditor.SceneManagement.NewSceneSetup.DefaultGameObjects, + UnityEditor.SceneManagement.NewSceneMode.Single); + + /* 4. 删除默认相机(和灯光)*/ + foreach (var go in newScene.GetRootGameObjects()) + { + if (go.name == "Main Camera" || go.name == "Directional Light") + GameObject.DestroyImmediate(go); + } + + /* 5. 载入并实例化 RKCameraRig.prefab */ + string prefabPath = "Prefabs/BaseSetting/RKCameraRig"; + + var prefab = Resources.Load(prefabPath); + var spawned = (GameObject)PrefabUtility.InstantiatePrefab(prefab); + spawned.name = "RKCameraRig"; + + /* 6. 保存场景 */ + string scenePath = Path.Combine("Assets/Art", name, "Scenes", "Test", "TestScene.unity"); + UnityEditor.SceneManagement.EditorSceneManager.SaveScene(newScene, scenePath); + } + + + string domainPath = $"{Application.dataPath}/Domain/{domain}"; + if (Directory.Exists(domainPath + "/AddressableRes/Config/DomainConfig.asset")) + { + EditorUtility.DisplayDialog("错误!", $"\"{domain}\"已经存在,无法创建", "确定"); + return; + } + + CreatDirectory(domainPath); + + //程序资源存放文件夹 + string resPath = $"{domainPath}/AddressableRes"; + CreatDirectory(resPath); + //创建音频文件夹 + CreatDirectory(resPath + "/Audios"); + //创建Config文件夹 + CreatDirectory(resPath + "/Config"); + //创建Dll文件夹 + CreatDirectory(resPath + "/Dll"); + //创建Prefabs文件夹 + CreatDirectory(resPath + "/Prefabs"); + //创建Scenes文件夹 + CreatDirectory(resPath + "/Scenes"); + //创建SpriteAtlas文件夹 + CreatDirectory(resPath + "/SpriteAtlas"); + //创建Sprites文件夹 + CreatDirectory(resPath + "/Sprites"); + //创建Video文件夹 + CreatDirectory(resPath + "/Video"); + + File.WriteAllTextAsync($"{resPath}/这里放所有参与热更的资源.hint", ""); + + //主入口预制件 + GameObject gameObj = new GameObject(domain); + gameObj.transform.position = Vector3.zero; + gameObj.transform.rotation = Quaternion.identity; + gameObj.name = domain; + + + + CreatDirectory($"{resPath}/Prefabs"); + string rootPfbFilePath = $"Assets/Domain/{domain}/AddressableRes/Prefabs/{domain}.prefab"; + var localPath = AssetDatabase.GenerateUniqueAssetPath(rootPfbFilePath); + PrefabUtility.SaveAsPrefabAsset(gameObj, localPath); + + //存放脚本文件夹 + string scriptsPath = $"{domainPath}/HotUpdate"; + CreatDirectory(scriptsPath); + File.WriteAllTextAsync($"{scriptsPath}/这里放所有参与热更的脚本文件.hint", "该文件夹中的程序集定义文件,请勿删除,非常重要。"); + + //创建配置文件夹 + string confPath = $"{domainPath}/Conf"; + CreatDirectory(confPath); + + + //程序集配置资源 + + string hotfixDomain = $"HotUpdate_{domain}"; + + string hotfixDomainAsmdef = $"{scriptsPath}/{hotfixDomain}.asmdef"; + await using (var writer = new StreamWriter(hotfixDomainAsmdef)) + { + string body = Resources.Load("AssemblyDefinitionTemplate").text; + body = body.Replace("MODULE_IDENT", hotfixDomain); + body = body.Replace("ROOT_NAMESPACE", hotfixDomain); + await writer.WriteAsync(body); + } + + //模块化脚本生成配置 + string domainClassName = $"{domain}Domain"; + string architectureClassName = $"{domain}Architecture"; +#if HotUpdate + //模块配置资源 + DomainConfig moduleConfig = CreateInstance(); + moduleConfig.domain = domain; + moduleConfig.className = domainClassName; + moduleConfig.mainPrefab = "Prefabs_" + gameObj.name; + moduleConfig.@namespace = domain; + AssetDatabase.CreateAsset(moduleConfig, $"Assets/Domain/{domain}/AddressableRes/Config/DomainConfig.asset"); + // + + + //编辑器配置资源 + BuildAssetDataSetting buildAssetDataSetting = CreateInstance(); + 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(configPath); + if (domain != "Main") + { + + // 将程序集定义添加到 HybridCLR 热更列表 + var settings = SettingsUtil.HybridCLRSettings; + if (!settings.hotUpdateAssemblyDefinitions.Contains(assemblyDefinitionAsset)) + { + var assemblyList = settings.hotUpdateAssemblyDefinitions.ToList(); + assemblyList.Add(assemblyDefinitionAsset); + SettingsUtil.HybridCLRSettings.hotUpdateAssemblyDefinitions = assemblyList.ToArray(); + } + + + List assemblies = new List(); + 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(); + + } +#endif + 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("DomainTemplate").text; + domainTemplate = domainTemplate.Replace("ClassNameXX", domainClassName) + .Replace("ReturnArchitecture", architectureClassName) + .Replace("ArchitectureX", architectureClassName) + .Replace("NamespaceX", domain) + .Replace("DomainNameXX", domain); + await writer.WriteAsync(domainTemplate); + } + } + + + [TitleGroup("预览Domain作用域")] + [ListDrawerSettings(DraggableItems = false, ShowFoldout = false, ShowPaging = false, ShowItemCount = false, + HideRemoveButton = true,HideAddButton = true)] + public List domainList; + + protected override void Initialize() + { + base.Initialize(); + domainList = GetCreatDomainAll(); + } + + /// + /// 获取全部作用域 + /// + 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(); + } + + + return domains; + } + + /// + /// 获取全部作用域 + /// + public static List 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(); + } + + List domainList = new List(); + 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; + } + + private static void CreatDirectory(string artDomainPath) + { + if (!Directory.Exists(artDomainPath)) + { + //创建Animation文件夹 + Directory.CreateDirectory(artDomainPath); + } + } + + public static void CreateDomainDirectory(string domain) + { + string artDomainPath = $"{Application.dataPath}/Art/{domain}"; + //创建Animation文件夹 + CreatDirectory(artDomainPath + "/Animation"); + //创建Effects文件夹 + CreatDirectory(artDomainPath + "/Effects"); + //创建Fbx文件夹 + CreatDirectory(artDomainPath + "/Fbx"); + //创建Font文件夹 + CreatDirectory(artDomainPath + "/Font"); + //创建Materials文件夹 + CreatDirectory(artDomainPath + "/Materials"); + //创建Prefabs文件夹 + CreatDirectory(artDomainPath + "/Prefabs"); + //创建Scenes文件夹 + CreatDirectory(artDomainPath + "/Scenes"); + //创建/Scenes/Test文件夹 + CreatDirectory(artDomainPath + "/Scenes/Test"); + //创建Shader文件夹 + CreatDirectory(artDomainPath + "/Shader"); + //创建Textures文件夹 + CreatDirectory(artDomainPath + "/Textures"); + + string domainPath = $"{Application.dataPath}/Domain/{domain}"; + //程序资源存放文件夹 + string resPath = $"{domainPath}/AddressableRes"; + CreatDirectory(resPath); + //创建音频文件夹 + CreatDirectory(resPath + "/Audios"); + //创建Config文件夹 + CreatDirectory(resPath + "/Config"); + //创建Dll文件夹 + CreatDirectory(resPath + "/Dll"); + //创建Prefabs文件夹 + CreatDirectory(resPath + "/Prefabs"); + //创建Scenes文件夹 + CreatDirectory(resPath + "/Scenes"); + //创建SpriteAtlas文件夹 + CreatDirectory(resPath + "/SpriteAtlas"); + //创建Sprites文件夹 + CreatDirectory(resPath + "/Sprites"); + //创建Video文件夹 + CreatDirectory(resPath + "/Video"); + + AssetDatabase.Refresh(); + } + } +} \ No newline at end of file diff --git a/Assets/00.StaryEvo/Editor/ArtBuild/CreatArtAssetWindow.cs.meta b/Assets/00.StaryEvo/Editor/ArtBuild/CreatArtAssetWindow.cs.meta new file mode 100644 index 0000000..0376f85 --- /dev/null +++ b/Assets/00.StaryEvo/Editor/ArtBuild/CreatArtAssetWindow.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e5909a71d7434c24809d3529ded3e0a0 +timeCreated: 1761202481 \ No newline at end of file diff --git a/Assets/00.StaryEvo/Editor/Build/AutoBuildPackage.cs b/Assets/00.StaryEvo/Editor/Build/AutoBuildPackage.cs index 2ec9e4d..968bdc1 100644 --- a/Assets/00.StaryEvo/Editor/Build/AutoBuildPackage.cs +++ b/Assets/00.StaryEvo/Editor/Build/AutoBuildPackage.cs @@ -64,7 +64,8 @@ namespace Stary.Evo.Editor { if (oneKeyBUildEntity.isRaw) { - MarkAdressable.CollectSVC(oneKeyBUildEntity.DomainName); + MarkAdressable.CollectSVC(MarkAdressable.DomainRoot, oneKeyBUildEntity.DomainName, + () => { EditorUtility.DisplayDialog("收集shader【材质异常或资源修改】", "收集成功", "确定"); }); } } @@ -165,7 +166,9 @@ namespace Stary.Evo.Editor { buildAssetDataSetting.environmentType = EnvironmentType.Release; buildAssetDataSetting.SetEnvironmentType(); - buildAssetDataSetting.viewer = new BuiltinBuildPipelineViewer(buildAssetDataSetting); + buildAssetDataSetting.viewer = new BuiltinBuildPipelineViewer(buildAssetDataSetting.packageName, + buildAssetDataSetting.selectedBuildPipelines.ToString(), + buildAssetDataSetting.packageVersion); buildAssetDataSetting.viewer.clearBuildCacheToggle = true; buildAssetDataSetting.viewer.SetBuildCacheToggle(); EditorApplication.delayCall += buildAssetDataSetting.viewer.ExecuteBuild; diff --git a/Assets/00.StaryEvo/Editor/Build/BuildApkWindow.cs b/Assets/00.StaryEvo/Editor/Build/BuildApkWindow.cs index f4f8407..f544664 100644 --- a/Assets/00.StaryEvo/Editor/Build/BuildApkWindow.cs +++ b/Assets/00.StaryEvo/Editor/Build/BuildApkWindow.cs @@ -10,7 +10,7 @@ namespace Stary.Evo.Editor { public static OdinEditorWindow window; - [MenuItem("Evo/Apk打包工具")] + [MenuItem("Evo/Dev/Apk打包工具")] static void ShowWindows() { window = (BuildApkWindow)EditorWindow.GetWindow(typeof(BuildApkWindow)); diff --git a/Assets/00.StaryEvo/Editor/BuildAsset/BuildAssetDataSetting.cs b/Assets/00.StaryEvo/Editor/BuildAsset/BuildAssetDataSetting.cs index c4b1ac6..3ac265e 100644 --- a/Assets/00.StaryEvo/Editor/BuildAsset/BuildAssetDataSetting.cs +++ b/Assets/00.StaryEvo/Editor/BuildAsset/BuildAssetDataSetting.cs @@ -9,7 +9,7 @@ using YooAsset.Editor; namespace Stary.Evo.Editor { [CreateAssetMenu(fileName = "BuildAssetDataSetting", menuName = "Evo/BuildAssetDataSetting")] - public class BuildAssetDataSetting : SerializedScriptableObject + public class BuildAssetDataSetting : SerializedScriptableObject { public void OnEnable() { @@ -143,6 +143,7 @@ namespace Stary.Evo.Editor packageVersion = $"{packageVersionX}.{packageVersionY}.{packageVersionZ}"; } + BuildPipelineViewer(); EditorUtility.SetDirty(this); AssetDatabase.SaveAssets(); return version; @@ -197,22 +198,23 @@ namespace Stary.Evo.Editor if (_viewers.ContainsKey(selectedBuildPipelines)) { viewer = _viewers[selectedBuildPipelines]; + viewer.SetBuildPackageData(packageName, selectedBuildPipelines.ToString(), packageVersion); } else { switch (selectedBuildPipelines) { case EBuildPipeline.EditorSimulateBuildPipeline: - viewer = new SimulateBuildPipelineViewer(this); + viewer = new SimulateBuildPipelineViewer(packageName, selectedBuildPipelines.ToString(), packageVersion); break; case EBuildPipeline.BuiltinBuildPipeline: - viewer = new BuiltinBuildPipelineViewer(this); + viewer = new BuiltinBuildPipelineViewer(packageName, selectedBuildPipelines.ToString(), packageVersion); break; case EBuildPipeline.ScriptableBuildPipeline: - viewer = new ScriptableBuildPipelineViewer(this); + viewer = new ScriptableBuildPipelineViewer(packageName, selectedBuildPipelines.ToString(), packageVersion); break; case EBuildPipeline.RawFileBuildPipeline: - viewer = new RawfileBuildpipelineViewer(this); + viewer = new RawfileBuildpipelineViewer(packageName, selectedBuildPipelines.ToString(), packageVersion); break; } diff --git a/Assets/00.StaryEvo/Editor/BuildAsset/BuildAssetWindow.cs b/Assets/00.StaryEvo/Editor/BuildAsset/BuildAssetWindow.cs index 4b6160e..c8a93f7 100644 --- a/Assets/00.StaryEvo/Editor/BuildAsset/BuildAssetWindow.cs +++ b/Assets/00.StaryEvo/Editor/BuildAsset/BuildAssetWindow.cs @@ -31,7 +31,7 @@ namespace Stary.Evo.Editor public static OdinEditorWindow window; private HotfixMainResDomain hotfixMainResDomain; - [MenuItem("Evo/资源打包工具")] + [MenuItem("Evo/Dev/资源打包工具")] static void ShowWindows() { #if NotUpdate @@ -177,7 +177,7 @@ namespace Stary.Evo.Editor [HorizontalGroup("Build/BuildPipeline"), HideLabel] public string buildTarget; - public static string packageName; + private static string packageName; #region HyBridCLRBuild @@ -204,7 +204,7 @@ namespace Stary.Evo.Editor [Title("标记资源", titleAlignment: TitleAlignments.Centered)] [HorizontalGroup("Build/HyBridClrBuildEntity"), HideLabel] public BuildAssetEntity markAssetEntity = - new BuildAssetEntity("MarkAsset", "MarkAsset", MarkAdressable.AddMark); + new BuildAssetEntity("MarkAsset", "MarkAsset", MarkAdressable.AddDomainMark); #endregion @@ -230,7 +230,7 @@ namespace Stary.Evo.Editor if (selectedPackageNames.IsNullOrEmpty()) { - // string buildPackageName = DataSetting.packageName; + // string buildPackageName = packageName; // if (result.Exists(p => p == buildPackageName)) // { // selectedPackageNames = buildPackageName; @@ -548,7 +548,6 @@ namespace Stary.Evo.Editor } GUILayout.EndScrollView(); - BuildServerPath(); UpdateBuildPipelineButtonName(); } @@ -558,30 +557,7 @@ namespace Stary.Evo.Editor onUpdateBuildPipelineEntity.SetButtonName($"更新至服务器【版本:{BuildAssetDataSetting.packageVersion}】"); } - /// - /// 生成服务器路径 - /// - 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}】"); - } } - public enum BuildAssetType - { - Login, - Build, - } + } \ No newline at end of file diff --git a/Assets/00.StaryEvo/Editor/BuildAsset/BuiltinBuildPipelineViewer.cs b/Assets/00.StaryEvo/Editor/BuildAsset/BuiltinBuildPipelineViewer.cs index 64bf185..8f15dd2 100644 --- a/Assets/00.StaryEvo/Editor/BuildAsset/BuiltinBuildPipelineViewer.cs +++ b/Assets/00.StaryEvo/Editor/BuildAsset/BuiltinBuildPipelineViewer.cs @@ -7,30 +7,36 @@ using YooAsset.Editor; namespace Stary.Evo.Editor { [Serializable] - public class BuiltinBuildPipelineViewer :AbstractBuildPipelineViewer + public class BuiltinBuildPipelineViewer : AbstractBuildPipelineViewer { - public BuiltinBuildPipelineViewer(BuildAssetDataSetting packageName) : base(packageName) + public BuiltinBuildPipelineViewer(string packageName, string selectedBuildPipelines, string packageVersion) : + base(packageName, selectedBuildPipelines, packageVersion) { - // isSimulate = false; + // isSimulate = false; } public override void ExecuteBuild() { - var fileNameStyle = AssetBundleBuilderSetting.GetPackageFileNameStyle(dataSetting.packageName, dataSetting.selectedBuildPipelines.ToString()); - var buildinFileCopyOption = AssetBundleBuilderSetting.GetPackageBuildinFileCopyOption(dataSetting.packageName, dataSetting.selectedBuildPipelines.ToString()); - var buildinFileCopyParams = AssetBundleBuilderSetting.GetPackageBuildinFileCopyParams(dataSetting.packageName, dataSetting.selectedBuildPipelines.ToString()); - var compressOption = AssetBundleBuilderSetting.GetPackageCompressOption(dataSetting.packageName, dataSetting.selectedBuildPipelines.ToString()); - var clearBuildCache = AssetBundleBuilderSetting.GetPackageClearBuildCache(dataSetting.packageName, dataSetting.selectedBuildPipelines.ToString()); - var useAssetDependencyDB = AssetBundleBuilderSetting.GetPackageUseAssetDependencyDB(dataSetting.packageName, dataSetting.selectedBuildPipelines.ToString()); + var fileNameStyle = AssetBundleBuilderSetting.GetPackageFileNameStyle(packageName, selectedBuildPipelines); + var buildinFileCopyOption = + AssetBundleBuilderSetting.GetPackageBuildinFileCopyOption(packageName, selectedBuildPipelines); + var buildinFileCopyParams = + AssetBundleBuilderSetting.GetPackageBuildinFileCopyParams(packageName, selectedBuildPipelines); + var compressOption = + AssetBundleBuilderSetting.GetPackageCompressOption(packageName, selectedBuildPipelines); + var clearBuildCache = + AssetBundleBuilderSetting.GetPackageClearBuildCache(packageName, selectedBuildPipelines); + var useAssetDependencyDB = + AssetBundleBuilderSetting.GetPackageUseAssetDependencyDB(packageName, selectedBuildPipelines); BuiltinBuildParameters buildParameters = new BuiltinBuildParameters(); buildParameters.BuildOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot(); buildParameters.BuildinFileRoot = AssetBundleBuilderHelper.GetStreamingAssetsRoot(); - buildParameters.BuildPipeline = dataSetting.selectedBuildPipelines.ToString(); + buildParameters.BuildPipeline = selectedBuildPipelines.ToString(); buildParameters.BuildBundleType = (int)EBuildBundleType.AssetBundle; buildParameters.BuildTarget = EditorUserBuildSettings.activeBuildTarget; - buildParameters.PackageName = dataSetting.packageName; - buildParameters.PackageVersion =dataSetting.GetBuildPackageVersion(); + buildParameters.PackageName = packageName; + buildParameters.PackageVersion = packageVersion; buildParameters.EnableSharePackRule = true; buildParameters.VerifyBuildingResult = true; buildParameters.FileNameStyle = fileNameStyle; @@ -49,8 +55,6 @@ namespace Stary.Evo.Editor //EditorUtility.RevealInFinder(buildResult.OutputPackageDirectory); base.ExecuteBuild(); } - - } } } \ No newline at end of file diff --git a/Assets/00.StaryEvo/Editor/BuildAsset/CreatAssetWindow.cs b/Assets/00.StaryEvo/Editor/BuildAsset/CreatAssetWindow.cs index f05da11..0a04d8a 100644 --- a/Assets/00.StaryEvo/Editor/BuildAsset/CreatAssetWindow.cs +++ b/Assets/00.StaryEvo/Editor/BuildAsset/CreatAssetWindow.cs @@ -16,7 +16,7 @@ namespace Stary.Evo.Editor { public class CreatAssetWindow : OdinEditorWindow { - [MenuItem("Evo/创建Domain作用域")] + [MenuItem("Evo/Dev/创建Domain作用域")] static void Init() { // Get existing open window or if none, make a new one: diff --git a/Assets/00.StaryEvo/Editor/BuildAsset/Entity/CreatArtDomainEntity.cs b/Assets/00.StaryEvo/Editor/BuildAsset/Entity/CreatArtDomainEntity.cs new file mode 100644 index 0000000..7536999 --- /dev/null +++ b/Assets/00.StaryEvo/Editor/BuildAsset/Entity/CreatArtDomainEntity.cs @@ -0,0 +1,61 @@ +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 domainList; + + [HorizontalGroup] [ReadOnly] public string DomainName; + [ReadOnly] + public string domainPath; + + + public CreatDomainEntity(List domainList) + { + this.domainList = domainList; + } + [HorizontalGroup(Width = 60)] + [Button("", Icon = SdfIconType.ArrowRepeat, IconAlignment = IconAlignment.RightEdge)] + public void CreatDomain() + { + if (DomainName == "Main") + { + EditorUtility.DisplayDialog("提示", "主包Main作用域无法再次创建", "确定"); + return; + } + bool isOk = EditorUtility.DisplayDialog("提示", "是否检索并创建缺失目录", "是", "否"); + if (isOk) + { + CreatAssetWindow.CreateDomainDirectory(DomainName); + } + } + [HorizontalGroup(Width = 60)] + [Button("", Icon = SdfIconType.XCircle, IconAlignment = IconAlignment.RightEdge)] + public void CloseDomain() + { + if (DomainName == "Main") + { + EditorUtility.DisplayDialog("提示", "主包Main作用域无法删除", "确定"); + return; + } + bool isOk = EditorUtility.DisplayDialog("提示", "是否删除此Domain", "是", "否"); + if (isOk) + { + BuildArtAssetWindow.RemoveBuildAssetWindow(); + EditorFrameworkUtils.DeleteAllChild(domainPath, FileAttributes.Normal); + domainList.Clear(); + AssetDatabase.Refresh(); + + AssetDatabase.SaveAssets(); + } + } + + } +} \ No newline at end of file diff --git a/Assets/00.StaryEvo/Editor/BuildAsset/Entity/CreatArtDomainEntity.cs.meta b/Assets/00.StaryEvo/Editor/BuildAsset/Entity/CreatArtDomainEntity.cs.meta new file mode 100644 index 0000000..6909721 --- /dev/null +++ b/Assets/00.StaryEvo/Editor/BuildAsset/Entity/CreatArtDomainEntity.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6799dae03a614d0cbd6263333517b6af +timeCreated: 1761274861 \ No newline at end of file diff --git a/Assets/00.StaryEvo/Editor/BuildAsset/IBuildPipelineViewer.cs b/Assets/00.StaryEvo/Editor/BuildAsset/IBuildPipelineViewer.cs index 90ea60e..d155c37 100644 --- a/Assets/00.StaryEvo/Editor/BuildAsset/IBuildPipelineViewer.cs +++ b/Assets/00.StaryEvo/Editor/BuildAsset/IBuildPipelineViewer.cs @@ -12,8 +12,15 @@ namespace Stary.Evo.Editor [Serializable] public class AbstractBuildPipelineViewer { - protected BuildAssetDataSetting dataSetting; + //protected BuildAssetDataSetting dataSetting; + #region 打包相关参数 + + protected string packageName; + protected string selectedBuildPipelines; + protected string packageVersion; + + #endregion // protected bool isSimulate; // protected bool isRaw; @@ -21,15 +28,15 @@ namespace Stary.Evo.Editor [HorizontalGroup("BuildCache")] [InfoBox("当不勾选此项的时候,引擎会开启增量打包模式,会极大提高构建速度!")] [OnValueChanged("SetBuildCacheToggle")] - [HideIf("@ dataSetting.selectedBuildPipelines==EBuildPipeline.EditorSimulateBuildPipeline")] + [HideIf("@ selectedBuildPipelines==EBuildPipeline.EditorSimulateBuildPipeline.ToString()")] public bool clearBuildCacheToggle; [Title("依赖数据库", titleAlignment: TitleAlignments.Centered)] [HorizontalGroup("BuildCache")] [InfoBox("当开启此项的时候,会极大提高构建速度!")] [OnValueChanged("SetUseAssetDependencyDB")] - [HideIf("@ dataSetting.selectedBuildPipelines==EBuildPipeline.EditorSimulateBuildPipeline")] - public bool useAssetDependencyDBToggle; + [HideIf("@ selectedBuildPipelines==EBuildPipeline.EditorSimulateBuildPipeline.ToString()")] + public bool useAssetDependencyDBToggle=true; @@ -37,7 +44,7 @@ namespace Stary.Evo.Editor [HorizontalGroup("BuildCache"), HideLabel] [InfoBox("推荐LZ4压缩方式")] [OnValueChanged("SetCompression")] - [HideIf("@ dataSetting.selectedBuildPipelines==EBuildPipeline.EditorSimulateBuildPipeline")] + [HideIf("@ selectedBuildPipelines==EBuildPipeline.EditorSimulateBuildPipeline.ToString()")] public ECompressOption compression = ECompressOption.LZ4; // [Title("资源包文件名称样式", titleAlignment: TitleAlignments.Centered)] @@ -50,8 +57,8 @@ namespace Stary.Evo.Editor [VerticalGroup("BuildCache/FileStyle"), HideLabel] [InfoBox("资源拷贝方式,是否拷贝StreamingAssets")] [OnValueChanged("SetCopyBuildinFileOption")] - [HideIf("@ dataSetting.selectedBuildPipelines==EBuildPipeline.EditorSimulateBuildPipeline")] - public EBuildinFileCopyOption copyBuildinFileOption; + [HideIf("@ selectedBuildPipelines==EBuildPipeline.EditorSimulateBuildPipeline.ToString()")] + public EBuildinFileCopyOption copyBuildinFileOption = EBuildinFileCopyOption.ClearAndCopyAll; [VerticalGroup("BuildCache/FileStyle"), HideLabel] [OnValueChanged("SetCopyBuildinFileParams")] @@ -59,9 +66,11 @@ namespace Stary.Evo.Editor "@copyBuildinFileOption==EBuildinFileCopyOption.ClearAndCopyByTags||copyBuildinFileOption==EBuildinFileCopyOption.OnlyCopyByTags ")] public string copyBuildinFileParams; - public AbstractBuildPipelineViewer(BuildAssetDataSetting dataSetting) + public AbstractBuildPipelineViewer(string packageName,string selectedBuildPipelines,string packageVersion) { - this.dataSetting = dataSetting; + //this.dataSetting = dataSetting; + SetBuildPackageData(packageName,selectedBuildPipelines,packageVersion); + useAssetDependencyDBToggle = true; SetUseAssetDependencyDB(); clearBuildCacheToggle = false; @@ -74,26 +83,32 @@ namespace Stary.Evo.Editor SetCopyBuildinFileOption(); } + public void SetBuildPackageData(string packageName,string selectedBuildPipelines,string packageVersion) + { + this.packageName = packageName; + this.selectedBuildPipelines = selectedBuildPipelines; + this.packageVersion = packageVersion; + } #region AssetBuild private void SetCompression() { - AssetBundleBuilderSetting.SetPackageCompressOption(dataSetting.packageName, dataSetting.selectedBuildPipelines.ToString(), + AssetBundleBuilderSetting.SetPackageCompressOption(packageName, selectedBuildPipelines, compression); } private void SetFileNameStyle() { - AssetBundleBuilderSetting.SetPackageFileNameStyle(dataSetting.packageName, dataSetting.selectedBuildPipelines.ToString(), + AssetBundleBuilderSetting.SetPackageFileNameStyle(packageName, selectedBuildPipelines, fileNameStyle); } private void SetCopyBuildinFileOption() { - AssetBundleBuilderSetting.SetPackageBuildinFileCopyOption(dataSetting.packageName, - dataSetting.selectedBuildPipelines.ToString(), copyBuildinFileOption); + AssetBundleBuilderSetting.SetPackageBuildinFileCopyOption(packageName, + selectedBuildPipelines, copyBuildinFileOption); //PlayerPrefs.SetInt("CopyBuildinFileOption", (int)copyBuildinFileOption); } @@ -101,21 +116,21 @@ namespace Stary.Evo.Editor private void SetCopyBuildinFileParams() { - AssetBundleBuilderSetting.SetPackageBuildinFileCopyParams(dataSetting.packageName, - dataSetting.selectedBuildPipelines.ToString(), copyBuildinFileParams); + AssetBundleBuilderSetting.SetPackageBuildinFileCopyParams(packageName, + selectedBuildPipelines, copyBuildinFileParams); //PlayerPrefs.SetInt("CopyBuildinFileOption", (int)copyBuildinFileOption); } public void SetBuildCacheToggle() { - AssetBundleBuilderSetting.SetPackageClearBuildCache(dataSetting.packageName, dataSetting.selectedBuildPipelines.ToString(), + AssetBundleBuilderSetting.SetPackageClearBuildCache(packageName, selectedBuildPipelines, clearBuildCacheToggle); } - private void SetUseAssetDependencyDB() + public void SetUseAssetDependencyDB() { - AssetBundleBuilderSetting.SetPackageUseAssetDependencyDB(dataSetting.packageName, dataSetting.selectedBuildPipelines.ToString(), + AssetBundleBuilderSetting.SetPackageUseAssetDependencyDB(packageName, selectedBuildPipelines, useAssetDependencyDBToggle); } @@ -139,8 +154,8 @@ namespace Stary.Evo.Editor protected IEncryptionServices CreateEncryptionInstance() { var encyptionClassName = - AssetBundleBuilderSetting.GetPackageEncyptionServicesClassName(dataSetting.packageName, - dataSetting.selectedBuildPipelines.ToString()); + AssetBundleBuilderSetting.GetPackageEncyptionServicesClassName(packageName, + selectedBuildPipelines); var encryptionClassTypes = EditorTools.GetAssignableTypes(typeof(IEncryptionServices)); var classType = encryptionClassTypes.Find(x => x.FullName.Equals(encyptionClassName)); if (classType != null) diff --git a/Assets/00.StaryEvo/Editor/BuildAsset/OneKeyBuildWindow.cs b/Assets/00.StaryEvo/Editor/BuildAsset/OneKeyBuildWindow.cs index 834075e..9d67dd3 100644 --- a/Assets/00.StaryEvo/Editor/BuildAsset/OneKeyBuildWindow.cs +++ b/Assets/00.StaryEvo/Editor/BuildAsset/OneKeyBuildWindow.cs @@ -15,7 +15,7 @@ namespace Stary.Evo.Editor { public class OneKeyBuildWindow : OdinEditorWindow { - [MenuItem("Evo/(一键)打包工具")] + [MenuItem("Evo/Dev/(一键)打包工具")] static void Init() { #if NotUpdate diff --git a/Assets/00.StaryEvo/Editor/BuildAsset/RawfileBuildpipelineViewer.cs b/Assets/00.StaryEvo/Editor/BuildAsset/RawfileBuildpipelineViewer.cs index d4a8b4a..3d55573 100644 --- a/Assets/00.StaryEvo/Editor/BuildAsset/RawfileBuildpipelineViewer.cs +++ b/Assets/00.StaryEvo/Editor/BuildAsset/RawfileBuildpipelineViewer.cs @@ -9,7 +9,8 @@ namespace Stary.Evo.Editor [Serializable] public class RawfileBuildpipelineViewer:AbstractBuildPipelineViewer { - public RawfileBuildpipelineViewer(BuildAssetDataSetting packageName) : base(packageName) + public RawfileBuildpipelineViewer(string packageName, string selectedBuildPipelines, string packageVersion) : + base(packageName, selectedBuildPipelines, packageVersion) { // isSimulate = false; // isRaw = true; @@ -18,20 +19,20 @@ namespace Stary.Evo.Editor public override void ExecuteBuild() { - var fileNameStyle = AssetBundleBuilderSetting.GetPackageFileNameStyle(dataSetting.packageName, dataSetting.selectedBuildPipelines.ToString()); - var buildinFileCopyOption = AssetBundleBuilderSetting.GetPackageBuildinFileCopyOption(dataSetting.packageName, dataSetting.selectedBuildPipelines.ToString()); - var buildinFileCopyParams = AssetBundleBuilderSetting.GetPackageBuildinFileCopyParams(dataSetting.packageName, dataSetting.selectedBuildPipelines.ToString()); - var clearBuildCache = AssetBundleBuilderSetting.GetPackageClearBuildCache(dataSetting.packageName, dataSetting.selectedBuildPipelines.ToString()); - var useAssetDependencyDB = AssetBundleBuilderSetting.GetPackageUseAssetDependencyDB(dataSetting.packageName, dataSetting.selectedBuildPipelines.ToString()); + var fileNameStyle = AssetBundleBuilderSetting.GetPackageFileNameStyle(packageName, selectedBuildPipelines); + var buildinFileCopyOption = AssetBundleBuilderSetting.GetPackageBuildinFileCopyOption(packageName, selectedBuildPipelines); + var buildinFileCopyParams = AssetBundleBuilderSetting.GetPackageBuildinFileCopyParams(packageName, selectedBuildPipelines); + var clearBuildCache = AssetBundleBuilderSetting.GetPackageClearBuildCache(packageName, selectedBuildPipelines); + var useAssetDependencyDB = AssetBundleBuilderSetting.GetPackageUseAssetDependencyDB(packageName, selectedBuildPipelines); RawFileBuildParameters buildParameters = new RawFileBuildParameters(); buildParameters.BuildOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot(); buildParameters.BuildinFileRoot = AssetBundleBuilderHelper.GetStreamingAssetsRoot(); - buildParameters.BuildPipeline = dataSetting.selectedBuildPipelines.ToString(); + buildParameters.BuildPipeline = selectedBuildPipelines; buildParameters.BuildBundleType = (int)EBuildBundleType.RawBundle; buildParameters.BuildTarget = EditorUserBuildSettings.activeBuildTarget; - buildParameters.PackageName = dataSetting.packageName; - buildParameters.PackageVersion =dataSetting.GetBuildPackageVersion(); + buildParameters.PackageName = packageName; + buildParameters.PackageVersion =packageVersion; buildParameters.VerifyBuildingResult = true; buildParameters.FileNameStyle = fileNameStyle; buildParameters.BuildinFileCopyOption = buildinFileCopyOption; diff --git a/Assets/00.StaryEvo/Editor/BuildAsset/ScriptableBuildPipelineViewer.cs b/Assets/00.StaryEvo/Editor/BuildAsset/ScriptableBuildPipelineViewer.cs index e834e2a..002bb52 100644 --- a/Assets/00.StaryEvo/Editor/BuildAsset/ScriptableBuildPipelineViewer.cs +++ b/Assets/00.StaryEvo/Editor/BuildAsset/ScriptableBuildPipelineViewer.cs @@ -9,29 +9,30 @@ namespace Stary.Evo.Editor [Serializable] public class ScriptableBuildPipelineViewer:AbstractBuildPipelineViewer { - public ScriptableBuildPipelineViewer(BuildAssetDataSetting packageName) : base(packageName) + public ScriptableBuildPipelineViewer(string packageName, string selectedBuildPipelines, string packageVersion) : + base(packageName, selectedBuildPipelines, packageVersion) { //isSimulate = false; } public override void ExecuteBuild() { - var fileNameStyle = AssetBundleBuilderSetting.GetPackageFileNameStyle(dataSetting.packageName, dataSetting.selectedBuildPipelines.ToString()); - var buildinFileCopyOption = AssetBundleBuilderSetting.GetPackageBuildinFileCopyOption(dataSetting.packageName, dataSetting.selectedBuildPipelines.ToString()); - var buildinFileCopyParams = AssetBundleBuilderSetting.GetPackageBuildinFileCopyParams(dataSetting.packageName, dataSetting.selectedBuildPipelines.ToString()); - var compressOption = AssetBundleBuilderSetting.GetPackageCompressOption(dataSetting.packageName, dataSetting.selectedBuildPipelines.ToString()); - var clearBuildCache = AssetBundleBuilderSetting.GetPackageClearBuildCache(dataSetting.packageName, dataSetting.selectedBuildPipelines.ToString()); - var useAssetDependencyDB = AssetBundleBuilderSetting.GetPackageUseAssetDependencyDB(dataSetting.packageName, dataSetting.selectedBuildPipelines.ToString()); + var fileNameStyle = AssetBundleBuilderSetting.GetPackageFileNameStyle(packageName, selectedBuildPipelines); + var buildinFileCopyOption = AssetBundleBuilderSetting.GetPackageBuildinFileCopyOption(packageName, selectedBuildPipelines); + var buildinFileCopyParams = AssetBundleBuilderSetting.GetPackageBuildinFileCopyParams(packageName, selectedBuildPipelines); + var compressOption = AssetBundleBuilderSetting.GetPackageCompressOption(packageName, selectedBuildPipelines); + var clearBuildCache = AssetBundleBuilderSetting.GetPackageClearBuildCache(packageName, selectedBuildPipelines); + var useAssetDependencyDB = AssetBundleBuilderSetting.GetPackageUseAssetDependencyDB(packageName, selectedBuildPipelines); var builtinShaderBundleName = GetBuiltinShaderBundleName(); ScriptableBuildParameters buildParameters = new ScriptableBuildParameters(); buildParameters.BuildOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot(); buildParameters.BuildinFileRoot = AssetBundleBuilderHelper.GetStreamingAssetsRoot(); - buildParameters.BuildPipeline = dataSetting.selectedBuildPipelines.ToString(); + buildParameters.BuildPipeline = selectedBuildPipelines; buildParameters.BuildBundleType = (int)EBuildBundleType.AssetBundle; buildParameters.BuildTarget = EditorUserBuildSettings.activeBuildTarget; - buildParameters.PackageName = dataSetting.packageName; - buildParameters.PackageVersion = dataSetting.GetBuildPackageVersion(); + buildParameters.PackageName = packageName; + buildParameters.PackageVersion = packageVersion; buildParameters.EnableSharePackRule = true; buildParameters.VerifyBuildingResult = true; buildParameters.FileNameStyle = fileNameStyle; @@ -63,7 +64,7 @@ namespace Stary.Evo.Editor { var uniqueBundleName = AssetBundleCollectorSettingData.Setting.UniqueBundleName; var packRuleResult = DefaultPackRule.CreateShadersPackRuleResult(); - return packRuleResult.GetBundleName(dataSetting.packageName, uniqueBundleName); + return packRuleResult.GetBundleName(packageName, uniqueBundleName); } } } \ No newline at end of file diff --git a/Assets/00.StaryEvo/Editor/BuildAsset/SimulateBuildPipelineViewer.cs b/Assets/00.StaryEvo/Editor/BuildAsset/SimulateBuildPipelineViewer.cs index 85fca4a..e30e846 100644 --- a/Assets/00.StaryEvo/Editor/BuildAsset/SimulateBuildPipelineViewer.cs +++ b/Assets/00.StaryEvo/Editor/BuildAsset/SimulateBuildPipelineViewer.cs @@ -8,25 +8,25 @@ namespace Stary.Evo.Editor [Serializable] public class SimulateBuildPipelineViewer:AbstractBuildPipelineViewer { - public SimulateBuildPipelineViewer(BuildAssetDataSetting packageName) : base(packageName) + public SimulateBuildPipelineViewer(string packageName, string selectedBuildPipelines, string packageVersion) : base(packageName, selectedBuildPipelines, packageVersion) { //isSimulate = true; } public override void ExecuteBuild() { - var fileNameStyle = AssetBundleBuilderSetting.GetPackageFileNameStyle(dataSetting.packageName, dataSetting.selectedBuildPipelines.ToString()); - var buildinFileCopyOption = AssetBundleBuilderSetting.GetPackageBuildinFileCopyOption(dataSetting.packageName, dataSetting.selectedBuildPipelines.ToString()); - var buildinFileCopyParams = AssetBundleBuilderSetting.GetPackageBuildinFileCopyParams(dataSetting.packageName, dataSetting.selectedBuildPipelines.ToString()); + var fileNameStyle = AssetBundleBuilderSetting.GetPackageFileNameStyle(packageName, selectedBuildPipelines); + var buildinFileCopyOption = AssetBundleBuilderSetting.GetPackageBuildinFileCopyOption(packageName, selectedBuildPipelines); + var buildinFileCopyParams = AssetBundleBuilderSetting.GetPackageBuildinFileCopyParams(packageName, selectedBuildPipelines); EditorSimulateBuildParameters buildParameters = new EditorSimulateBuildParameters(); buildParameters.BuildOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot(); buildParameters.BuildinFileRoot = AssetBundleBuilderHelper.GetStreamingAssetsRoot(); - buildParameters.BuildPipeline = dataSetting.selectedBuildPipelines.ToString(); + buildParameters.BuildPipeline = selectedBuildPipelines; buildParameters.BuildBundleType = (int)EBuildBundleType.VirtualBundle; buildParameters.BuildTarget = EditorUserBuildSettings.activeBuildTarget; - buildParameters.PackageName = dataSetting.packageName; - buildParameters.PackageVersion = dataSetting.GetBuildPackageVersion(); + buildParameters.PackageName = packageName; + buildParameters.PackageVersion = packageVersion; buildParameters.VerifyBuildingResult = true; buildParameters.FileNameStyle = fileNameStyle; buildParameters.BuildinFileCopyOption = buildinFileCopyOption; diff --git a/Assets/00.StaryEvo/Editor/MarkAdressable/MarkAdressable.cs b/Assets/00.StaryEvo/Editor/MarkAdressable/MarkAdressable.cs index 7f722ae..f5a02c4 100644 --- a/Assets/00.StaryEvo/Editor/MarkAdressable/MarkAdressable.cs +++ b/Assets/00.StaryEvo/Editor/MarkAdressable/MarkAdressable.cs @@ -24,7 +24,10 @@ namespace Stary.Evo.Editor { get { return Application.dataPath + "/Domain"; } } - + public static string ArtRoot + { + get { return Application.dataPath + "/Art"; } + } //[MenuItem("Evo/Hotfix/Addressable")] public static void AddHotfixAddressableDll() @@ -134,7 +137,7 @@ namespace Stary.Evo.Editor { YooAsset.Editor.AssetBundleCollectorSettingData.RemovePackage(assetBundleCollectorPackage); } - Mark(); + MarkDomain(); CreateRes(_packageName, $"{DomainRoot}/{oneKeyBUildEntity.DomainName}/AddressableRes", @@ -145,8 +148,26 @@ namespace Stary.Evo.Editor } } - //[MenuItem("Evo/Hotfix/标记资源")] - public static void AddMark() + public static void AddArtMark(Action complete) + { + _packageName = BuildArtAssetWindow.GetBuildPackageName(); + AssetBundleCollectorPackage assetBundleCollectorPackage = null; + foreach (var package in AssetBundleCollectorSettingData.Setting.Packages) + { + if (package.PackageName ==_packageName) + { + assetBundleCollectorPackage = package; + } + } + if (assetBundleCollectorPackage != null) + { + YooAsset.Editor.AssetBundleCollectorSettingData.RemovePackage(assetBundleCollectorPackage); + } + MarkArt(); + CollectSVC(ArtRoot, _packageName,complete); + } + + public static void AddDomainMark() { // //清空主包旧数据 AssetBundleCollectorPackage assetBundleCollectorPackage = null; @@ -173,14 +194,16 @@ namespace Stary.Evo.Editor DomainConfig domainConfig = AssetDatabase.LoadAssetAtPath(configPath); _packageName = domainConfig.domain; - Mark(); + MarkDomain(); CreateRes(_packageName, $"{DomainRoot}/{BuildAssetWindow.GetBuildPackageName()}/AddressableRes", $"{DomainRoot}/{BuildAssetWindow.GetBuildPackageName()}/HotUpdate"); - CollectSVC(BuildAssetWindow.GetBuildPackageName()); - EditorUtility.DisplayDialog("自动标记", "自动标记成功", "确定"); + CollectSVC(DomainRoot,BuildAssetWindow.GetBuildPackageName(),()=> + { + EditorUtility.DisplayDialog("自动标记", "自动标记成功", "确定"); + }); } @@ -198,7 +221,61 @@ namespace Stary.Evo.Editor public static Dictionary collectorGroupDic = new Dictionary(); - public static void Mark() + public static void MarkArt() + { + addressDic.Clear(); + collectorGroupDic.Clear(); + ///创建分组 + string remotedRoot = $"{ArtRoot}/{_packageName}"; + DirectoryInfo[] dirs = new DirectoryInfo(remotedRoot).GetDirectories(); + + var setting = YooAsset.Editor.AssetBundleCollectorSettingData.Setting; + setting.ShowPackageView = true; + setting.UniqueBundleName = true; + //创建Package文件 + package = YooAsset.Editor.AssetBundleCollectorSettingData.CreatePackage(_packageName); + + //检测Packages是否存在TestPackage + package.PackageName = _packageName; + package.EnableAddressable = true; + package.IncludeAssetGUID = true; + package.AutoCollectShaders = true; + package.IgnoreRuleName = "NormalIgnoreRule"; + + //检测Packages是否存在Group + foreach (var info in dirs) + { + string groupName = info.Name; + + if (info.Name == "Scenes") + { + AssetBundleCollectorGroup collectorGroup = + YooAsset.Editor.AssetBundleCollectorSettingData.CreateGroup(package, groupName); + collectorGroup.AssetTags = groupName; + if (!collectorGroupDic.ContainsKey(groupName)) + { + collectorGroupDic.Add(groupName, collectorGroup); + } + else + { + Debug.LogError("分组 : " + groupName + "已存在,请检查资源目录,避免重复"); + } + AutoMarkRootAddress(info); + break; + } + } + // AssetDatabase.SaveAssets(); + // AssetDatabase.Refresh(); + MarkStatus(); + YooAsset.Editor.AssetBundleCollectorSettingData.SaveFile(); + + // CreateRes(); + + + Debug.Log("MarkAsset Successful"); + } + + public static void MarkDomain() { addressDic.Clear(); collectorGroupDic.Clear(); @@ -485,9 +562,9 @@ namespace Stary.Evo.Editor } } - public static void CollectSVC(string packageName) + public static void CollectSVC(string root,string packageName,Action complete) { - string remotedRoot = $"{DomainRoot}/{packageName}/ShaderVariants"; + string remotedRoot = $"{root}/{packageName}/ShaderVariants"; string remotedRootFileName = $"{remotedRoot}/{packageName}.shadervariants"; if (!Directory.Exists(remotedRoot)) { @@ -509,6 +586,8 @@ namespace Stary.Evo.Editor $"UnityEvo:【{packageName}】VariantCount : {collection.variantCount}"); CreateShaderVariantsGroup(packageName, localSavePath); + + complete?.Invoke(); } else { diff --git a/Assets/00.StaryEvo/Editor/Type.meta b/Assets/00.StaryEvo/Editor/Type.meta new file mode 100644 index 0000000..f325e79 --- /dev/null +++ b/Assets/00.StaryEvo/Editor/Type.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6db9ac74e11743f88b708a1018685c93 +timeCreated: 1761199081 \ No newline at end of file diff --git a/Assets/00.StaryEvo/Editor/Type/BuildType.cs b/Assets/00.StaryEvo/Editor/Type/BuildType.cs new file mode 100644 index 0000000..1bedcce --- /dev/null +++ b/Assets/00.StaryEvo/Editor/Type/BuildType.cs @@ -0,0 +1,8 @@ +namespace Stary.Evo +{ + public enum BuildAssetType + { + Login, + Build, + } +} \ No newline at end of file diff --git a/Assets/00.StaryEvo/Editor/Type/BuildType.cs.meta b/Assets/00.StaryEvo/Editor/Type/BuildType.cs.meta new file mode 100644 index 0000000..399ee2a --- /dev/null +++ b/Assets/00.StaryEvo/Editor/Type/BuildType.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 7153744cd9354cff92f319655857379f +timeCreated: 1761199110 \ No newline at end of file diff --git a/Assets/00.StaryEvo/package.json b/Assets/00.StaryEvo/package.json index 8744b12..e7b93df 100644 --- a/Assets/00.StaryEvo/package.json +++ b/Assets/00.StaryEvo/package.json @@ -1,6 +1,6 @@ { "name": "com.staryevo.main", - "version": "2.0.13", + "version": "2.0.14", "displayName": "00.StaryEvo", "description": "This is an Framework package(后台服务器版本,端口9527)", "unity": "2021.3", diff --git a/Assets/00.StaryEvoTools/Runtime/HybridLoad/Base/AppConfig.cs b/Assets/00.StaryEvoTools/Runtime/HybridLoad/Base/AppConfig.cs index d46b08e..f762e59 100644 --- a/Assets/00.StaryEvoTools/Runtime/HybridLoad/Base/AppConfig.cs +++ b/Assets/00.StaryEvoTools/Runtime/HybridLoad/Base/AppConfig.cs @@ -25,7 +25,7 @@ namespace Stary.Evo /// private static GameObject _MainBaseModel; - + /// /// 赋值默认的实例 diff --git a/Assets/00.StaryEvoTools/Runtime/HybridLoad/Fsm/LoadResState.cs b/Assets/00.StaryEvoTools/Runtime/HybridLoad/Fsm/LoadResState.cs index 243f7be..cb6826a 100644 --- a/Assets/00.StaryEvoTools/Runtime/HybridLoad/Fsm/LoadResState.cs +++ b/Assets/00.StaryEvoTools/Runtime/HybridLoad/Fsm/LoadResState.cs @@ -16,7 +16,8 @@ namespace Stary.Evo { private DomainConfig.LoadResType loadResType; public GameObject mainPrefab; - private DomainConfig domainConfig; + private DomainConfig domainConfig; + public LoadResState(IFsmSystemAsync system) : base(system) { } @@ -39,42 +40,33 @@ namespace Stary.Evo loadResType = domainConfig.loadResType; Type type = param2 as Type; var package = YooAssets.GetPackage(domainConfig.domain); - if (loadResType == DomainConfig.LoadResType.Prefab) + switch (loadResType) { - // 加载热更资源 - var loadOperation = package.LoadAssetAsync(domainConfig.mainPrefab); + case DomainConfig.LoadResType.Prefab: - await loadOperation; - if (loadOperation.Status == EOperationStatus.Succeed) - { + LoadDomainPrefab(package); - #if Immersal - ARSpace arSpace = GameObject.FindObjectOfType(); - if (arSpace != null) + break; + case DomainConfig.LoadResType.Scene: + + var sceneMode = domainConfig.loadSceneMode; + var physicsMode = LocalPhysicsMode.None; + SceneHandle handle = package.LoadSceneAsync(domainConfig.mainScene, sceneMode, physicsMode); + await handle; + Scene targetScene = SceneManager.GetSceneByName(domainConfig.mainScene); + targetScene.name = domainConfig.mainScene; + // 设置为 active scene 或者后续 Move 到该 scene + SceneManager.SetActiveScene(targetScene); + + mainPrefab = GameObject.Find(domainConfig.mainPrefab); + if (mainPrefab == null) { - Debug.Log("UnityEvo:找到ARSpace,开始加载点云运行环境..."); - mainPrefab = loadOperation.InstantiateSync(arSpace.transform); - } else - { - Debug.Log("UnityEvo:未找到ARSpace,开始加载普通运行环境,通过语音唤醒..."); - mainPrefab = loadOperation.InstantiateSync(); + LoadDomainPrefab(package); } - #elif NotPointClond - mainPrefab = loadOperation.InstantiateSync(); - #endif - if(domainConfig.domain =="Main") - AppConfig.SetDefaultMainInstance(mainPrefab); - } - } - else if (loadResType == DomainConfig.LoadResType.Scene) - { - var sceneMode = domainConfig.loadSceneMode; - var physicsMode = LocalPhysicsMode.None; - SceneHandle handle = package.LoadSceneAsync(domainConfig.mainScene, sceneMode, physicsMode); - await handle; - mainPrefab = GameObject.Find(domainConfig.mainPrefab); + break; } + LocalTransformInfo info = mainPrefab.GetOrAddComponent(); FsmLoadSystem fsmLoadSystem = FsmSystem as FsmLoadSystem; @@ -93,10 +85,11 @@ namespace Stary.Evo info.transform.position = fsmLoadSystem.GetTransformCtor().position; info.transform.rotation = Quaternion.Euler(fsmLoadSystem.GetTransformCtor().rotation); info.transform.localScale = fsmLoadSystem.GetTransformCtor().scale; - }else{ - info.Switch(0); } - + else + { + info.Switch(0); + } } else { @@ -130,6 +123,32 @@ namespace Stary.Evo base.OnUpdate(); } + private async void LoadDomainPrefab(ResourcePackage package) + { + // 加载热更资源 + var loadOperation = package.LoadAssetAsync(domainConfig.mainPrefab); + + await loadOperation; + if (loadOperation.Status == EOperationStatus.Succeed) + { +#if Immersal + ARSpace arSpace = GameObject.FindObjectOfType(); + if (arSpace != null) + { + Debug.Log("UnityEvo:找到ARSpace,开始加载点云运行环境..."); + mainPrefab = loadOperation.InstantiateSync(arSpace.transform); + } else + { + Debug.Log("UnityEvo:未找到ARSpace,开始加载普通运行环境,通过语音唤醒..."); + mainPrefab = loadOperation.InstantiateSync(); + } +#elif NotPointClond + mainPrefab = loadOperation.InstantiateSync(); +#endif + if (domainConfig.domain == "Main") + AppConfig.SetDefaultMainInstance(mainPrefab); + } + } public override async UniTask OnExitAsync() { @@ -149,7 +168,7 @@ namespace Stary.Evo if (loadResType == DomainConfig.LoadResType.Scene) { - await SceneManager.UnloadSceneAsync("server"); + await SceneManager.UnloadSceneAsync(domainConfig.mainScene); } if (domainBase != null) @@ -158,7 +177,6 @@ namespace Stary.Evo await ForceUnloadAllAssets(domainBase.DomainName); } - } } diff --git a/Assets/00.StaryEvoTools/Runtime/HybridLoad/Fsm/ResStartState.cs b/Assets/00.StaryEvoTools/Runtime/HybridLoad/Fsm/ResStartState.cs index 481dc92..abe25f5 100644 --- a/Assets/00.StaryEvoTools/Runtime/HybridLoad/Fsm/ResStartState.cs +++ b/Assets/00.StaryEvoTools/Runtime/HybridLoad/Fsm/ResStartState.cs @@ -58,17 +58,12 @@ namespace Stary.Evo // 初始化资源包 #if EDITOR_SIMULATEMODE await EDITOR_SIMULATEMODE(package); - FsmSystem.SetCurState(nameof(ResUpdateServerState)); + FsmSystem.SetCurState(nameof(ResUpdateServerState)); #elif OFFLINE_PLAYMODE await OFFLINE_PLAYMODE(package); FsmSystem.SetCurState(nameof(ResUpdateLocalState)); #elif HOST_PLAYMODE - // if (package.PackageName.Equals("Main")) - // { - // await OFFLINE_PLAYMODE(package); - // } - // else - // { + //登录 string url = AppConfig.IpConfig + "/Authentication/login"; bool isLogin = await WebRequestSystem.Login(url, AppConfig.UserName, AppConfig.PassWord); @@ -76,7 +71,7 @@ namespace Stary.Evo await HOST_PLAYMODE(package); else await Chche_PLAYMODE(package); - // } + FsmSystem.SetCurState(nameof(ResUpdateLocalState)); @@ -125,6 +120,7 @@ namespace Stary.Evo private async UniTask EDITOR_SIMULATEMODE(ResourcePackage package) { + var initParams=YooAssetFileSystem.EditorSimulateInitializeParameter(package.PackageName); var initialization = package.InitializeAsync(initParams); await initialization; diff --git a/Assets/00.StaryEvoTools/Runtime/HybridLoad/HybridClREntrance.cs b/Assets/00.StaryEvoTools/Runtime/HybridLoad/HybridClREntrance.cs index 59d434f..8f2c356 100644 --- a/Assets/00.StaryEvoTools/Runtime/HybridLoad/HybridClREntrance.cs +++ b/Assets/00.StaryEvoTools/Runtime/HybridLoad/HybridClREntrance.cs @@ -67,8 +67,14 @@ namespace Stary.Evo { this.domain = domain; _fsmSystem.SetOpenDomainType(openDomainType); - AppConfig.PackageDomainName = domain; - _fsmSystem.SetCurState(nameof(ResStartState)); + if (this.domain != AppConfig.PackageDomainName) + { + AppConfig.PackageDomainName = domain; + _fsmSystem.SetCurState(nameof(ResStartState)); + } + else + { + } } public void OpenDomain(string domain, TransformCtor transformCtor) @@ -76,8 +82,14 @@ namespace Stary.Evo this.domain = domain; _fsmSystem.SetOpenDomainType(OpenDomainType.ImageTracked); _fsmSystem.SetTransformCtor(transformCtor); - AppConfig.PackageDomainName = domain; - _fsmSystem.SetCurState(nameof(ResStartState)); + if (this.domain != AppConfig.PackageDomainName) + { + AppConfig.PackageDomainName = domain; + _fsmSystem.SetCurState(nameof(ResStartState)); + } + else + { + } } public void OpenDomain(string domain, Transform transform) @@ -85,8 +97,14 @@ namespace Stary.Evo this.domain = domain; _fsmSystem.SetOpenDomainType(OpenDomainType.ImageTracked); _fsmSystem.SetTransformCtor(transform); - AppConfig.PackageDomainName = domain; - _fsmSystem.SetCurState(nameof(ResStartState)); + if (this.domain != AppConfig.PackageDomainName) + { + AppConfig.PackageDomainName = domain; + _fsmSystem.SetCurState(nameof(ResStartState)); + } + else + { + } } public void CloseDomain() diff --git a/Assets/00.StaryEvoTools/package.json b/Assets/00.StaryEvoTools/package.json index c158bc9..17e55fe 100644 --- a/Assets/00.StaryEvoTools/package.json +++ b/Assets/00.StaryEvoTools/package.json @@ -1,6 +1,6 @@ { "name": "com.staryevo.tools", - "version": "1.1.4", + "version": "1.1.5", "displayName": "00.StaryEvo.Tools", "description": "This is an Framework package(后台服务器版本,端口9527)", "unity": "2021.3",