using HybridCLR.Editor.Commands; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using UnityEditor; using UnityEditor.EditorTools; using UnityEngine; using EditorTools = YooAsset.Editor.EditorTools; namespace HybridCLR.Editor { public static class AssetBundleBuildCommand { public static string HybridCLRBuildCacheDir => Application.dataPath + "/HybridCLRBuildCache"; public static string AssetBundleOutputDir => $"{HybridCLRBuildCacheDir}/AssetBundleOutput"; public static string AssetBundleSourceDataTempDir => $"{HybridCLRBuildCacheDir}/AssetBundleSourceData"; public static string GetAssetBundleOutputDirByTarget(BuildTarget target) { return $"{AssetBundleOutputDir}/{target}"; } public static string YooAssetCodeDll = Application.dataPath + "/Res/CodeDll/"; public static string GetAssetBundleTempDirByTarget(BuildTarget target) { return $"{AssetBundleSourceDataTempDir}/{target}"; } public static string ToRelativeAssetPath(string s) { return s.Substring(s.IndexOf("Assets/")); } /// /// 将HotFix.dll和HotUpdatePrefab.prefab打入common包. /// 将HotUpdateScene.unity打入scene包. /// /// /// /// private static void BuildAssetBundles(string tempDir, string outputDir, BuildTarget target) { Directory.CreateDirectory(tempDir); Directory.CreateDirectory(outputDir); if (Directory.Exists(YooAssetCodeDll)) { EditorTools.DeleteDirectory(YooAssetCodeDll); } Directory.CreateDirectory(YooAssetCodeDll); //step 1 CompileDllCommand.CompileDll(target); //step 2 PrebuildCommand.GenerateAll(); //step 3 copy ET.BuildEditor.BuildModelAndHotfix(); //hotfix.dll不使用默认的打包,ET里面加了些骚操作 // List notSceneAssets = new List(); /*string hotfixDllSrcDir = SettingsUtil.GetHotUpdateDllsOutputDirByTarget(target); foreach (var dll in SettingsUtil.HotUpdateAssemblyFiles) { string dllPath = $"{hotfixDllSrcDir}/{dll}"; string dllBytesPath = $"{YooAssetCodeDll}/{dll}.bytes"; File.Copy(dllPath, dllBytesPath, true); // notSceneAssets.Add(dllBytesPath); Debug.Log($"[BuildAssetBundles] copy hotfix dll {dllPath} -> {dllBytesPath}"); }*/ //step 4 string aotDllDir = SettingsUtil.GetAssembliesPostIl2CppStripDir(target); ConfigStringList manifest = AssetDatabase.LoadAssetAtPath("Assets/Res/Config/HotUpdateAOTDlls.asset", typeof(ConfigStringList)) as ConfigStringList; if (manifest == null) { throw new Exception($"resource asset:{nameof(ConfigStringList)} 配置不存在,请在Resources目录下创建"); } List AOTMetaAssemblies= (manifest.List?? Array.Empty()).ToList(); foreach (var dll in AOTMetaAssemblies) { string dllPath = $"{aotDllDir}/{dll}"; if (!File.Exists(dllPath)) { Debug.LogError($"ab中添加AOT补充元数据dll:{dllPath} 时发生错误,文件不存在。裁剪后的AOT dll在BuildPlayer时才能生成,因此需要你先构建一次游戏App后再打包。"); continue; } string dllBytesPath = $"{YooAssetCodeDll}/{dll}.bytes"; File.Copy(dllPath, dllBytesPath, true); // notSceneAssets.Add(dllBytesPath); Debug.Log($"[BuildAssetBundles] copy AOT dll {dllPath} -> {dllBytesPath}"); } // string testPrefab = $"{Application.dataPath}/Prefabs/HotUpdatePrefab.prefab"; // notSceneAssets.Add(testPrefab); // AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate); // // List abs = new List(); // AssetBundleBuild notSceneAb = new AssetBundleBuild // { // assetBundleName = "common", // assetNames = notSceneAssets.Select(s => ToRelativeAssetPath(s)).ToArray(), // }; // abs.Add(notSceneAb); // // UnityEditor.BuildPipeline.BuildAssetBundles(outputDir, abs.ToArray(), BuildAssetBundleOptions.None, target); // // AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate); // // string streamingAssetPathDst = $"{Application.streamingAssetsPath}"; // Directory.CreateDirectory(streamingAssetPathDst); // // foreach (var ab in abs) // { // AssetDatabase.CopyAsset(ToRelativeAssetPath($"{outputDir}/{ab.assetBundleName}"), // ToRelativeAssetPath($"{streamingAssetPathDst}/{ab.assetBundleName}")); // } } public static void BuildAssetBundleByTarget(BuildTarget target) { BuildAssetBundles(GetAssetBundleTempDirByTarget(target), GetAssetBundleOutputDirByTarget(target), target); } [MenuItem("HybridCLR/CollectorDll/ActiveBuildTarget")] public static void BuildSceneAssetBundleActiveBuildTarget() { BuildAssetBundleByTarget(EditorUserBuildSettings.activeBuildTarget); } // [MenuItem("HybridCLR/CollectorDll/Win64")] // public static void BuildSceneAssetBundleWin64() // { // var target = BuildTarget.StandaloneWindows64; // BuildAssetBundleByTarget(target); // } // // [MenuItem("HybridCLR/CollectorDll/Win32")] // public static void BuildSceneAssetBundleWin32() // { // var target = BuildTarget.StandaloneWindows; // BuildAssetBundleByTarget(target); // } // // [MenuItem("HybridCLR/CollectorDll/Android")] // public static void BuildSceneAssetBundleAndroid() // { // var target = BuildTarget.Android; // BuildAssetBundleByTarget(target); // } // // [MenuItem("HybridCLR/CollectorDll/IOS")] // public static void BuildSceneAssetBundleIOS() // { // var target = BuildTarget.iOS; // BuildAssetBundleByTarget(target); // } } }