TaskBuilding_SBP.cs 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. using System;
  2. using System.Linq;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using UnityEditor.Build.Pipeline;
  6. using UnityEditor.Build.Pipeline.Interfaces;
  7. using UnityEditor.Build.Pipeline.Tasks;
  8. namespace YooAsset.Editor
  9. {
  10. [TaskAttribute("资源构建内容打包")]
  11. public class TaskBuilding_SBP : IBuildTask
  12. {
  13. public class BuildResultContext : IContextObject
  14. {
  15. public IBundleBuildResults Results;
  16. }
  17. void IBuildTask.Run(BuildContext context)
  18. {
  19. var buildParametersContext = context.GetContextObject<BuildParametersContext>();
  20. var buildMapContext = context.GetContextObject<BuildMapContext>();
  21. // 模拟构建模式下跳过引擎构建
  22. var buildMode = buildParametersContext.Parameters.BuildMode;
  23. if (buildMode == EBuildMode.SimulateBuild)
  24. return;
  25. // 构建内容
  26. var buildContent = new BundleBuildContent(buildMapContext.GetPipelineBuilds());
  27. // 开始构建
  28. IBundleBuildResults buildResults;
  29. var buildParameters = buildParametersContext.GetSBPBuildParameters();
  30. var shadersBunldeName = YooAssetSettingsData.GetUnityShadersBundleFullName();
  31. var taskList = SBPBuildTasks.Create(shadersBunldeName);
  32. ReturnCode exitCode = ContentPipeline.BuildAssetBundles(buildParameters, buildContent, out buildResults, taskList);
  33. if (exitCode < 0)
  34. {
  35. throw new Exception($"构建过程中发生错误 : {exitCode}");
  36. }
  37. BuildRunner.Log("Unity引擎打包成功!");
  38. BuildResultContext buildResultContext = new BuildResultContext();
  39. buildResultContext.Results = buildResults;
  40. context.SetContextObject(buildResultContext);
  41. if (buildMode == EBuildMode.ForceRebuild || buildMode == EBuildMode.IncrementalBuild)
  42. {
  43. CopyRawBundle(buildMapContext, buildParametersContext);
  44. UpdateBuildBundleInfo(buildMapContext, buildParametersContext, buildResultContext);
  45. }
  46. }
  47. /// <summary>
  48. /// 拷贝原生文件
  49. /// </summary>
  50. private void CopyRawBundle(BuildMapContext buildMapContext, BuildParametersContext buildParametersContext)
  51. {
  52. foreach (var bundleInfo in buildMapContext.BundleInfos)
  53. {
  54. if (bundleInfo.IsRawFile)
  55. {
  56. string dest = $"{buildParametersContext.PipelineOutputDirectory}/{bundleInfo.BundleName}";
  57. foreach (var buildAsset in bundleInfo.BuildinAssets)
  58. {
  59. if (buildAsset.IsRawAsset)
  60. EditorTools.CopyFile(buildAsset.AssetPath, dest, true);
  61. }
  62. }
  63. }
  64. }
  65. /// <summary>
  66. /// 更新构建结果
  67. /// </summary>
  68. private void UpdateBuildBundleInfo(BuildMapContext buildMapContext, BuildParametersContext buildParametersContext, BuildResultContext buildResult)
  69. {
  70. foreach (var bundleInfo in buildMapContext.BundleInfos)
  71. {
  72. if (bundleInfo.IsRawFile)
  73. {
  74. string filePath = $"{buildParametersContext.PipelineOutputDirectory}/{bundleInfo.BundleName}";
  75. bundleInfo.ContentHash = HashUtility.FileMD5(filePath);
  76. }
  77. else
  78. {
  79. // 注意:当资源包的依赖列表发生变化的时候,ContentHash也会发生变化!
  80. if (buildResult.Results.BundleInfos.TryGetValue(bundleInfo.BundleName, out var value))
  81. bundleInfo.ContentHash = value.Hash.ToString();
  82. else
  83. throw new Exception($"Not found bundle in build result : {bundleInfo.BundleName}");
  84. }
  85. }
  86. }
  87. }
  88. }