TaskBuilding.cs 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. using System;
  2. using System.Linq;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using UnityEditor;
  6. using UnityEngine;
  7. namespace YooAsset.Editor
  8. {
  9. [TaskAttribute("资源构建内容打包")]
  10. public class TaskBuilding : IBuildTask
  11. {
  12. public class BuildResultContext : IContextObject
  13. {
  14. public AssetBundleManifest UnityManifest;
  15. }
  16. void IBuildTask.Run(BuildContext context)
  17. {
  18. var buildParametersContext = context.GetContextObject<BuildParametersContext>();
  19. var buildMapContext = context.GetContextObject<BuildMapContext>();
  20. // 模拟构建模式下跳过引擎构建
  21. var buildMode = buildParametersContext.Parameters.BuildMode;
  22. if (buildMode == EBuildMode.SimulateBuild)
  23. return;
  24. BuildAssetBundleOptions opt = buildParametersContext.GetPipelineBuildOptions();
  25. AssetBundleManifest buildResults = BuildPipeline.BuildAssetBundles(buildParametersContext.PipelineOutputDirectory, buildMapContext.GetPipelineBuilds(), opt, buildParametersContext.Parameters.BuildTarget);
  26. if (buildResults == null)
  27. throw new Exception("构建过程中发生错误!");
  28. if (buildMode == EBuildMode.ForceRebuild || buildMode == EBuildMode.IncrementalBuild)
  29. {
  30. string unityOutputManifestFilePath = $"{buildParametersContext.PipelineOutputDirectory}/{YooAssetSettings.OutputFolderName}";
  31. if(System.IO.File.Exists(unityOutputManifestFilePath) == false)
  32. throw new Exception("构建过程中发生严重错误!请查阅上下文日志!");
  33. }
  34. BuildRunner.Log("Unity引擎打包成功!");
  35. BuildResultContext buildResultContext = new BuildResultContext();
  36. buildResultContext.UnityManifest = buildResults;
  37. context.SetContextObject(buildResultContext);
  38. if (buildMode == EBuildMode.ForceRebuild || buildMode == EBuildMode.IncrementalBuild)
  39. {
  40. CopyRawBundle(buildMapContext, buildParametersContext);
  41. UpdateBuildBundleInfo(buildMapContext, buildParametersContext, buildResultContext);
  42. }
  43. }
  44. /// <summary>
  45. /// 拷贝原生文件
  46. /// </summary>
  47. private void CopyRawBundle(BuildMapContext buildMapContext, BuildParametersContext buildParametersContext)
  48. {
  49. foreach (var bundleInfo in buildMapContext.BundleInfos)
  50. {
  51. if (bundleInfo.IsRawFile)
  52. {
  53. string dest = $"{buildParametersContext.PipelineOutputDirectory}/{bundleInfo.BundleName}";
  54. foreach (var buildAsset in bundleInfo.BuildinAssets)
  55. {
  56. if (buildAsset.IsRawAsset)
  57. EditorTools.CopyFile(buildAsset.AssetPath, dest, true);
  58. }
  59. }
  60. }
  61. }
  62. /// <summary>
  63. /// 更新构建结果
  64. /// </summary>
  65. private void UpdateBuildBundleInfo(BuildMapContext buildMapContext, BuildParametersContext buildParametersContext, BuildResultContext buildResult)
  66. {
  67. foreach (var bundleInfo in buildMapContext.BundleInfos)
  68. {
  69. if (bundleInfo.IsRawFile)
  70. {
  71. string filePath = $"{buildParametersContext.PipelineOutputDirectory}/{bundleInfo.BundleName}";
  72. bundleInfo.ContentHash = HashUtility.FileMD5(filePath);
  73. }
  74. else
  75. {
  76. var hash = buildResult.UnityManifest.GetAssetBundleHash(bundleInfo.BundleName);
  77. if (hash.isValid)
  78. bundleInfo.ContentHash = hash.ToString();
  79. else
  80. throw new Exception($"Not found bundle in build result : {bundleInfo.BundleName}");
  81. }
  82. }
  83. }
  84. }
  85. }