AssetBundleBuildCommand.cs 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. using HybridCLR.Editor.Commands;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. using UnityEditor;
  9. using UnityEditor.EditorTools;
  10. using UnityEngine;
  11. using EditorTools = YooAsset.Editor.EditorTools;
  12. namespace HybridCLR.Editor
  13. {
  14. public static class AssetBundleBuildCommand
  15. {
  16. public static string HybridCLRBuildCacheDir => Application.dataPath + "/HybridCLRBuildCache";
  17. public static string AssetBundleOutputDir => $"{HybridCLRBuildCacheDir}/AssetBundleOutput";
  18. public static string AssetBundleSourceDataTempDir => $"{HybridCLRBuildCacheDir}/AssetBundleSourceData";
  19. public static HotUpdateAssemblyManifest HotUpdateManifest => Resources.Load<HotUpdateAssemblyManifest>("HotUpdateAssemblyManifest");
  20. public static string GetAssetBundleOutputDirByTarget(BuildTarget target)
  21. {
  22. return $"{AssetBundleOutputDir}/{target}";
  23. }
  24. public static string YooAssetCodeDll = Application.dataPath + "/Res/CodeDll/";
  25. public static string GetAssetBundleTempDirByTarget(BuildTarget target)
  26. {
  27. return $"{AssetBundleSourceDataTempDir}/{target}";
  28. }
  29. public static string ToRelativeAssetPath(string s)
  30. {
  31. return s.Substring(s.IndexOf("Assets/"));
  32. }
  33. /// <summary>
  34. /// 将HotFix.dll和HotUpdatePrefab.prefab打入common包.
  35. /// 将HotUpdateScene.unity打入scene包.
  36. /// </summary>
  37. /// <param name="tempDir"></param>
  38. /// <param name="outputDir"></param>
  39. /// <param name="target"></param>
  40. private static void BuildAssetBundles(string tempDir, string outputDir, BuildTarget target)
  41. {
  42. Directory.CreateDirectory(tempDir);
  43. Directory.CreateDirectory(outputDir);
  44. if (Directory.Exists(YooAssetCodeDll))
  45. {
  46. EditorTools.DeleteDirectory(YooAssetCodeDll);
  47. }
  48. Directory.CreateDirectory(YooAssetCodeDll);
  49. //step 1
  50. CompileDllCommand.CompileDll(target);
  51. //step 2
  52. PrebuildCommand.GenerateAll();
  53. //step 3 copy
  54. // List<string> notSceneAssets = new List<string>();
  55. string hotfixDllSrcDir = SettingsUtil.GetHotUpdateDllsOutputDirByTarget(target);
  56. foreach (var dll in SettingsUtil.HotUpdateAssemblyFiles)
  57. {
  58. string dllPath = $"{hotfixDllSrcDir}/{dll}";
  59. string dllBytesPath = $"{YooAssetCodeDll}/{dll}.bytes";
  60. File.Copy(dllPath, dllBytesPath, true);
  61. // notSceneAssets.Add(dllBytesPath);
  62. Debug.Log($"[BuildAssetBundles] copy hotfix dll {dllPath} -> {dllBytesPath}");
  63. }
  64. //step 4
  65. string aotDllDir = SettingsUtil.GetAssembliesPostIl2CppStripDir(target);
  66. HotUpdateAssemblyManifest manifest = HotUpdateManifest;
  67. if (manifest == null)
  68. {
  69. throw new Exception($"resource asset:{nameof(HotUpdateAssemblyManifest)} 配置不存在,请在Resources目录下创建");
  70. }
  71. List<string> AOTMetaAssemblies= (manifest.AOTMetadataDlls ?? Array.Empty<string>()).ToList();
  72. foreach (var dll in AOTMetaAssemblies)
  73. {
  74. string dllPath = $"{aotDllDir}/{dll}";
  75. if (!File.Exists(dllPath))
  76. {
  77. Debug.LogError($"ab中添加AOT补充元数据dll:{dllPath} 时发生错误,文件不存在。裁剪后的AOT dll在BuildPlayer时才能生成,因此需要你先构建一次游戏App后再打包。");
  78. continue;
  79. }
  80. string dllBytesPath = $"{YooAssetCodeDll}/{dll}.bytes";
  81. File.Copy(dllPath, dllBytesPath, true);
  82. // notSceneAssets.Add(dllBytesPath);
  83. Debug.Log($"[BuildAssetBundles] copy AOT dll {dllPath} -> {dllBytesPath}");
  84. }
  85. // string testPrefab = $"{Application.dataPath}/Prefabs/HotUpdatePrefab.prefab";
  86. // notSceneAssets.Add(testPrefab);
  87. // AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate);
  88. //
  89. // List<AssetBundleBuild> abs = new List<AssetBundleBuild>();
  90. // AssetBundleBuild notSceneAb = new AssetBundleBuild
  91. // {
  92. // assetBundleName = "common",
  93. // assetNames = notSceneAssets.Select(s => ToRelativeAssetPath(s)).ToArray(),
  94. // };
  95. // abs.Add(notSceneAb);
  96. //
  97. // UnityEditor.BuildPipeline.BuildAssetBundles(outputDir, abs.ToArray(), BuildAssetBundleOptions.None, target);
  98. //
  99. // AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate);
  100. //
  101. // string streamingAssetPathDst = $"{Application.streamingAssetsPath}";
  102. // Directory.CreateDirectory(streamingAssetPathDst);
  103. //
  104. // foreach (var ab in abs)
  105. // {
  106. // AssetDatabase.CopyAsset(ToRelativeAssetPath($"{outputDir}/{ab.assetBundleName}"),
  107. // ToRelativeAssetPath($"{streamingAssetPathDst}/{ab.assetBundleName}"));
  108. // }
  109. }
  110. public static void BuildAssetBundleByTarget(BuildTarget target)
  111. {
  112. BuildAssetBundles(GetAssetBundleTempDirByTarget(target), GetAssetBundleOutputDirByTarget(target), target);
  113. }
  114. [MenuItem("HybridCLR/CollectorDll/ActiveBuildTarget")]
  115. public static void BuildSceneAssetBundleActiveBuildTarget()
  116. {
  117. BuildAssetBundleByTarget(EditorUserBuildSettings.activeBuildTarget);
  118. }
  119. // [MenuItem("HybridCLR/CollectorDll/Win64")]
  120. // public static void BuildSceneAssetBundleWin64()
  121. // {
  122. // var target = BuildTarget.StandaloneWindows64;
  123. // BuildAssetBundleByTarget(target);
  124. // }
  125. //
  126. // [MenuItem("HybridCLR/CollectorDll/Win32")]
  127. // public static void BuildSceneAssetBundleWin32()
  128. // {
  129. // var target = BuildTarget.StandaloneWindows;
  130. // BuildAssetBundleByTarget(target);
  131. // }
  132. //
  133. // [MenuItem("HybridCLR/CollectorDll/Android")]
  134. // public static void BuildSceneAssetBundleAndroid()
  135. // {
  136. // var target = BuildTarget.Android;
  137. // BuildAssetBundleByTarget(target);
  138. // }
  139. //
  140. // [MenuItem("HybridCLR/CollectorDll/IOS")]
  141. // public static void BuildSceneAssetBundleIOS()
  142. // {
  143. // var target = BuildTarget.iOS;
  144. // BuildAssetBundleByTarget(target);
  145. // }
  146. }
  147. }