AssetBundleBuildHelper.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using UnityEditor;
  8. using UnityEngine;
  9. namespace HybridCLR
  10. {
  11. public static class AssetBundleBuildHelper
  12. {
  13. public static string ToRelativeAssetPath(string s)
  14. {
  15. return s.Substring(s.IndexOf("Assets/"));
  16. }
  17. /// <summary>
  18. /// 将HotFix.dll和HotUpdatePrefab.prefab打入common包.
  19. /// 将HotUpdateScene.unity打入scene包.
  20. /// </summary>
  21. /// <param name="tempDir"></param>
  22. /// <param name="outputDir"></param>
  23. /// <param name="target"></param>
  24. private static void BuildAssetBundles(string tempDir, string outputDir, BuildTarget target)
  25. {
  26. Directory.CreateDirectory(tempDir);
  27. Directory.CreateDirectory(outputDir);
  28. CompileDllHelper.CompileDll(target);
  29. List<string> notSceneAssets = new List<string>();
  30. string hotfixDllSrcDir = BuildConfig.GetHotFixDllsOutputDirByTarget(target);
  31. foreach (var dll in BuildConfig.AllHotUpdateDllNames)
  32. {
  33. string dllPath = $"{hotfixDllSrcDir}/{dll}";
  34. string dllBytesPath = $"{tempDir}/{dll}.bytes";
  35. File.Copy(dllPath, dllBytesPath, true);
  36. notSceneAssets.Add(dllBytesPath);
  37. }
  38. string aotDllDir = BuildConfig.GetAssembliesPostIl2CppStripDir(target);
  39. foreach (var dll in BuildConfig.AOTMetaDlls)
  40. {
  41. string dllPath = $"{aotDllDir}/{dll}";
  42. if (!File.Exists(dllPath))
  43. {
  44. Debug.LogError($"ab中添加AOT补充元数据dll:{dllPath} 时发生错误,文件不存在。裁剪后的AOT dll在BuildPlayer时才能生成,因此需要你先构建一次游戏App后再打包。");
  45. continue;
  46. }
  47. string dllBytesPath = $"{tempDir}/{dll}.bytes";
  48. File.Copy(dllPath, dllBytesPath, true);
  49. notSceneAssets.Add(dllBytesPath);
  50. }
  51. string testPrefab = $"{Application.dataPath}/Prefabs/HotUpdatePrefab.prefab";
  52. notSceneAssets.Add(testPrefab);
  53. AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate);
  54. List<AssetBundleBuild> abs = new List<AssetBundleBuild>();
  55. AssetBundleBuild notSceneAb = new AssetBundleBuild
  56. {
  57. assetBundleName = "common",
  58. assetNames = notSceneAssets.Select(s => ToRelativeAssetPath(s)).ToArray(),
  59. };
  60. abs.Add(notSceneAb);
  61. BuildPipeline.BuildAssetBundles(outputDir, abs.ToArray(), BuildAssetBundleOptions.None, target);
  62. AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate);
  63. string streamingAssetPathDst = $"{Application.streamingAssetsPath}";
  64. Directory.CreateDirectory(streamingAssetPathDst);
  65. foreach (var ab in abs)
  66. {
  67. AssetDatabase.CopyAsset(ToRelativeAssetPath($"{outputDir}/{ab.assetBundleName}"),
  68. ToRelativeAssetPath($"{streamingAssetPathDst}/{ab.assetBundleName}"));
  69. }
  70. }
  71. public static void BuildAssetBundleByTarget(BuildTarget target)
  72. {
  73. BuildAssetBundles(BuildConfig.GetAssetBundleTempDirByTarget(target), BuildConfig.GetAssetBundleOutputDirByTarget(target), target);
  74. }
  75. [MenuItem("HybridCLR/BuildBundles/ActiveBuildTarget")]
  76. public static void BuildSceneAssetBundleActiveBuildTarget()
  77. {
  78. BuildAssetBundleByTarget(EditorUserBuildSettings.activeBuildTarget);
  79. }
  80. [MenuItem("HybridCLR/BuildBundles/Win64")]
  81. public static void BuildSceneAssetBundleWin64()
  82. {
  83. var target = BuildTarget.StandaloneWindows64;
  84. BuildAssetBundleByTarget(target);
  85. }
  86. [MenuItem("HybridCLR/BuildBundles/Win32")]
  87. public static void BuildSceneAssetBundleWin32()
  88. {
  89. var target = BuildTarget.StandaloneWindows;
  90. BuildAssetBundleByTarget(target);
  91. }
  92. [MenuItem("HybridCLR/BuildBundles/Android")]
  93. public static void BuildSceneAssetBundleAndroid()
  94. {
  95. var target = BuildTarget.Android;
  96. BuildAssetBundleByTarget(target);
  97. }
  98. [MenuItem("HybridCLR/BuildBundles/IOS")]
  99. public static void BuildSceneAssetBundleIOS()
  100. {
  101. var target = BuildTarget.iOS;
  102. BuildAssetBundleByTarget(target);
  103. }
  104. }
  105. }