BuildParametersContext.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEditor;
  5. namespace YooAsset.Editor
  6. {
  7. public class BuildParametersContext : IContextObject
  8. {
  9. private readonly System.Diagnostics.Stopwatch _buildWatch = new System.Diagnostics.Stopwatch();
  10. /// <summary>
  11. /// 构建参数
  12. /// </summary>
  13. public BuildParameters Parameters { private set; get; }
  14. /// <summary>
  15. /// 构建管线的输出目录
  16. /// </summary>
  17. public string PipelineOutputDirectory { private set; get; }
  18. public BuildParametersContext(BuildParameters parameters)
  19. {
  20. Parameters = parameters;
  21. PipelineOutputDirectory = AssetBundleBuilderHelper.MakePipelineOutputDirectory(parameters.OutputRoot, parameters.BuildTarget);
  22. if (parameters.BuildMode == EBuildMode.DryRunBuild)
  23. PipelineOutputDirectory += $"_{EBuildMode.DryRunBuild}";
  24. else if (parameters.BuildMode == EBuildMode.SimulateBuild)
  25. PipelineOutputDirectory += $"_{EBuildMode.SimulateBuild}";
  26. }
  27. /// <summary>
  28. /// 获取本次构建的补丁目录
  29. /// </summary>
  30. public string GetPackageDirectory()
  31. {
  32. return $"{Parameters.OutputRoot}/{Parameters.BuildTarget}/{Parameters.BuildVersion}";
  33. }
  34. /// <summary>
  35. /// 获取内置构建管线的构建选项
  36. /// </summary>
  37. public BuildAssetBundleOptions GetPipelineBuildOptions()
  38. {
  39. // For the new build system, unity always need BuildAssetBundleOptions.CollectDependencies and BuildAssetBundleOptions.DeterministicAssetBundle
  40. // 除非设置ForceRebuildAssetBundle标记,否则会进行增量打包
  41. if (Parameters.BuildMode == EBuildMode.SimulateBuild)
  42. throw new Exception("Should never get here !");
  43. BuildAssetBundleOptions opt = BuildAssetBundleOptions.None;
  44. opt |= BuildAssetBundleOptions.StrictMode; //Do not allow the build to succeed if any errors are reporting during it.
  45. if (Parameters.BuildMode == EBuildMode.DryRunBuild)
  46. {
  47. opt |= BuildAssetBundleOptions.DryRunBuild;
  48. return opt;
  49. }
  50. if (Parameters.CompressOption == ECompressOption.Uncompressed)
  51. opt |= BuildAssetBundleOptions.UncompressedAssetBundle;
  52. else if (Parameters.CompressOption == ECompressOption.LZ4)
  53. opt |= BuildAssetBundleOptions.ChunkBasedCompression;
  54. if (Parameters.BuildMode == EBuildMode.ForceRebuild)
  55. opt |= BuildAssetBundleOptions.ForceRebuildAssetBundle; //Force rebuild the asset bundles
  56. if (Parameters.DisableWriteTypeTree)
  57. opt |= BuildAssetBundleOptions.DisableWriteTypeTree; //Do not include type information within the asset bundle (don't write type tree).
  58. if (Parameters.IgnoreTypeTreeChanges)
  59. opt |= BuildAssetBundleOptions.IgnoreTypeTreeChanges; //Ignore the type tree changes when doing the incremental build check.
  60. opt |= BuildAssetBundleOptions.DisableLoadAssetByFileName; //Disables Asset Bundle LoadAsset by file name.
  61. opt |= BuildAssetBundleOptions.DisableLoadAssetByFileNameWithExtension; //Disables Asset Bundle LoadAsset by file name with extension.
  62. return opt;
  63. }
  64. /// <summary>
  65. /// 获取可编程构建管线的构建参数
  66. /// </summary>
  67. public UnityEditor.Build.Pipeline.BundleBuildParameters GetSBPBuildParameters()
  68. {
  69. if (Parameters.BuildMode == EBuildMode.SimulateBuild)
  70. throw new Exception("Should never get here !");
  71. var targetGroup = BuildPipeline.GetBuildTargetGroup(Parameters.BuildTarget);
  72. var buildParams = new UnityEditor.Build.Pipeline.BundleBuildParameters(Parameters.BuildTarget, targetGroup, PipelineOutputDirectory);
  73. if (Parameters.CompressOption == ECompressOption.Uncompressed)
  74. buildParams.BundleCompression = UnityEngine.BuildCompression.Uncompressed;
  75. else if (Parameters.CompressOption == ECompressOption.LZMA)
  76. buildParams.BundleCompression = UnityEngine.BuildCompression.LZMA;
  77. else if (Parameters.CompressOption == ECompressOption.LZ4)
  78. buildParams.BundleCompression = UnityEngine.BuildCompression.LZ4;
  79. else
  80. throw new System.NotImplementedException(Parameters.CompressOption.ToString());
  81. if (Parameters.DisableWriteTypeTree)
  82. buildParams.ContentBuildFlags |= UnityEditor.Build.Content.ContentBuildFlags.DisableWriteTypeTree;
  83. buildParams.UseCache = true;
  84. buildParams.CacheServerHost = Parameters.SBPParameters.CacheServerHost;
  85. buildParams.CacheServerPort = Parameters.SBPParameters.CacheServerPort;
  86. buildParams.WriteLinkXML = Parameters.SBPParameters.WriteLinkXML;
  87. return buildParams;
  88. }
  89. /// <summary>
  90. /// 获取构建的耗时(单位:秒)
  91. /// </summary>
  92. public float GetBuildingSeconds()
  93. {
  94. float seconds = _buildWatch.ElapsedMilliseconds / 1000f;
  95. return seconds;
  96. }
  97. public void BeginWatch()
  98. {
  99. _buildWatch.Start();
  100. }
  101. public void StopWatch()
  102. {
  103. _buildWatch.Stop();
  104. }
  105. }
  106. }