三国卡牌客户端基础资源仓库
yyl
5 天以前 0a3bfa23a80b0d31b08d09d3e48d30cb75964559
Assets/Editor/AssetBundleBrowser/AssetBundleBuildTab.cs
@@ -16,6 +16,7 @@
using HybridCLR.Editor;
using System.Text;
using Cysharp.Threading.Tasks;
using YooAsset.Editor;
namespace UnityEngine.AssetBundles
{
@@ -382,43 +383,7 @@
                EditorApplication.delayCall += ExecuteBuildAll;
            }
            EditorGUILayout.BeginHorizontal();
            if (GUILayout.Button("Prefab"))
            {
                EditorApplication.delayCall += ExcuteBuildConfig;
            }
            if (GUILayout.Button("UI+UIEffect"))
            {
                EditorApplication.delayCall += ExcuteBuildUI;
            }
            if (GUILayout.Button("Builtin"))
            {
                EditorApplication.delayCall += ExcuteBuildBuiltIn;
            }
            if (GUILayout.Button("Audio"))
            {
                EditorApplication.delayCall += ExcuteBuildAudio;
            }
            if (GUILayout.Button("Video"))
            {
                EditorApplication.delayCall += ExcuteBuildVideo;
            }
            if (GUILayout.Button("Battle"))
            {
                EditorApplication.delayCall += ExcuteBuildMobEffectShader;
            }
            if (GUILayout.Button("Dll(HybridCLR)"))
            {
                EditorApplication.delayCall += ExcuteBuildHybridclrUpdate;
            }
            EditorGUILayout.EndHorizontal();
            DrawYooAssetPackageButtons();
            EditorGUILayout.Space();
            if (GUILayout.Button("导出到 LocalCDN (D:\\LocalCDN)"))
@@ -492,8 +457,8 @@
            EditorGUILayout.Space();
            GUILayout.BeginHorizontal();
            ClientPackage.includeConfig = EditorGUILayout.Toggle("Include Config ", ClientPackage.includeConfig, GUILayout.Width(250));
            ClientPackage.includeUI = EditorGUILayout.Toggle("Include UI ", ClientPackage.includeUI, GUILayout.Width(250));
            ClientPackage.includeConfig = EditorGUILayout.Toggle("Include Config Package", ClientPackage.includeConfig, GUILayout.Width(250));
            ClientPackage.includeUI = EditorGUILayout.Toggle("Include UI Base Packages", ClientPackage.includeUI, GUILayout.Width(250));
            GUILayout.EndHorizontal();
            EditorGUILayout.Space();
@@ -617,6 +582,119 @@
            YooAssetBuildTool.CopyBuildOutputToLocalCDNFlat();
        }
        private static readonly string[] YooAssetPackageButtonOrder =
        {
            "Builtin",
            "Dll",
            "Config",
            "Shader",
            "Materials",
            "ScriptableObject",
            "Scenes",
            "Audio",
            "Battle",
            "Hero",
            "UI",
            "UIEffect",
            "Video",
        };
        private void DrawYooAssetPackageButtons()
        {
            var packageNames = GetYooAssetPackageNames();
            if (packageNames.Count == 0)
            {
                EditorGUILayout.HelpBox("AssetBundleCollectorSetting 中没有配置 YooAsset Package。", MessageType.Warning);
                return;
            }
            EditorGUILayout.LabelField("Build Single Package", EditorStyles.boldLabel);
            int columns = Mathf.Max(1, Mathf.FloorToInt((EditorGUIUtility.currentViewWidth - 30f) / 155f));
            for (int i = 0; i < packageNames.Count; i++)
            {
                if (i % columns == 0)
                    EditorGUILayout.BeginHorizontal();
                string packageName = packageNames[i];
                if (GUILayout.Button(GetYooAssetPackageButtonLabel(packageName)))
                {
                    string capturedPackageName = packageName;
                    EditorApplication.delayCall += () => ExecuteBuildYooAssetPackage(capturedPackageName);
                }
                if (i % columns == columns - 1 || i == packageNames.Count - 1)
                    EditorGUILayout.EndHorizontal();
            }
        }
        private List<string> GetYooAssetPackageNames()
        {
            var result = new List<string>();
            var setting = AssetBundleCollectorSettingData.Setting;
            if (setting == null || setting.Packages == null)
                return result;
            foreach (var packageName in YooAssetPackageButtonOrder)
            {
                if (HasYooAssetPackage(setting, packageName))
                    result.Add(packageName);
            }
            foreach (var package in setting.Packages)
            {
                if (package == null || string.IsNullOrEmpty(package.PackageName))
                    continue;
                if (!ContainsPackageName(result, package.PackageName))
                    result.Add(package.PackageName);
            }
            return result;
        }
        private static bool HasYooAssetPackage(AssetBundleCollectorSetting setting, string packageName)
        {
            foreach (var package in setting.Packages)
            {
                if (package != null && string.Equals(package.PackageName, packageName, StringComparison.OrdinalIgnoreCase))
                    return true;
            }
            return false;
        }
        private static bool ContainsPackageName(List<string> packageNames, string packageName)
        {
            foreach (var item in packageNames)
            {
                if (string.Equals(item, packageName, StringComparison.OrdinalIgnoreCase))
                    return true;
            }
            return false;
        }
        private static string GetYooAssetPackageButtonLabel(string packageName)
        {
            return string.Equals(packageName, "Dll", StringComparison.OrdinalIgnoreCase) ? "Dll(HybridCLR)" : packageName;
        }
        private void ExecuteBuildYooAssetPackage(string packageName)
        {
            if (string.Equals(packageName, "Builtin", StringComparison.OrdinalIgnoreCase))
            {
                ExcuteBuildBuiltIn();
            }
            else if (string.Equals(packageName, "Dll", StringComparison.OrdinalIgnoreCase))
            {
                ExcuteBuildHybridclrUpdate();
            }
            else
            {
                ExcuteBuildAsset(packageName);
            }
        }
        private void ExcuteBuildAsset(string yooPackageName)
        {
            string version = YooAssetBuildTool.GenerateVersion();
@@ -626,8 +704,11 @@
            if (ok)
            {
                YooAssetBuildTool.CopyStartupConfigsToStreamingAssets();
                Debug.Log($"[AssetBundleBuildTab] Package '{yooPackageName}' 打包成功!");
                bool copied = YooAssetBuildTool.CopySinglePackageBuildOutput(yooPackageName, m_UserData.m_OutputPath, version);
                if (copied)
                    Debug.Log($"[AssetBundleBuildTab] Package '{yooPackageName}' 打包并拷贝成功!");
                else
                    Debug.LogError($"[AssetBundleBuildTab] Package '{yooPackageName}' 打包成功,但拷贝到 StreamingAssets/外部资源目录失败!");
            }
            else
            {
@@ -662,7 +743,7 @@
        private void ExcuteBuildConfig()
        {
            ExcuteBuildAsset("Prefab");
            ExcuteBuildAsset("Config");
        }
        
        //发包时获取热更dll和裁剪AOT
@@ -700,8 +781,14 @@
                return;
            }
            if (!YooAssetBuildTool.CopySinglePackageBuildOutput("Dll", m_UserData.m_OutputPath, version))
            {
                Debug.LogError("[AssetBundleBuildTab] Dll Package 打包成功,但拷贝到 StreamingAssets/外部资源目录失败!");
                return;
            }
            AssetDatabase.Refresh();
            Debug.Log("[AssetBundleBuildTab] 热更新 DLL 增量打包完成。");
            Debug.Log("[AssetBundleBuildTab] 热更新 DLL 增量打包并拷贝完成。");
        }
@@ -870,13 +957,11 @@
        private void ExcuteBuildLevels()
        {
            // Scenes 在 YooAsset 的 Prefab Package 中
            ExcuteBuildAsset("Prefab");
            ExcuteBuildAsset("Scenes");
        }
        private void ExcuteBuildUI()
        {
            // UI 和 UIEffect 是两个独立 Package
            ExcuteBuildAsset("UI");
            ExcuteBuildAsset("UIEffect");
        }