TaskPrepare.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. using System;
  2. using System.IO;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using UnityEditor;
  6. namespace YooAsset.Editor
  7. {
  8. [TaskAttribute("资源构建准备工作")]
  9. public class TaskPrepare : IBuildTask
  10. {
  11. void IBuildTask.Run(BuildContext context)
  12. {
  13. var buildParametersContext = context.GetContextObject<BuildParametersContext>();
  14. var buildParameters = buildParametersContext.Parameters;
  15. // 检测构建参数合法性
  16. if (buildParameters.BuildTarget == BuildTarget.NoTarget)
  17. throw new Exception("请选择目标平台!");
  18. if (string.IsNullOrEmpty(buildParameters.PackageName))
  19. throw new Exception("包裹名称不能为空!");
  20. if (string.IsNullOrEmpty(buildParameters.PackageVersion))
  21. throw new Exception("包裹版本不能为空!");
  22. if (string.IsNullOrEmpty(buildParameters.BuildOutputRoot))
  23. throw new Exception("构建输出的根目录为空!");
  24. if (string.IsNullOrEmpty(buildParameters.StreamingAssetsRoot))
  25. throw new Exception("内置资源根目录为空!");
  26. if (buildParameters.BuildPipeline == EBuildPipeline.ScriptableBuildPipeline)
  27. {
  28. if (buildParameters.SBPParameters == null)
  29. throw new Exception($"{nameof(BuildParameters.SBPParameters)} is null !");
  30. if (buildParameters.BuildMode == EBuildMode.DryRunBuild)
  31. throw new Exception($"{nameof(EBuildPipeline.ScriptableBuildPipeline)} not support {nameof(EBuildMode.DryRunBuild)} build mode !");
  32. if (buildParameters.BuildMode == EBuildMode.ForceRebuild)
  33. throw new Exception($"{nameof(EBuildPipeline.ScriptableBuildPipeline)} not support {nameof(EBuildMode.ForceRebuild)} build mode !");
  34. }
  35. if (buildParameters.BuildMode != EBuildMode.SimulateBuild)
  36. {
  37. #if UNITY_2021_3_OR_NEWER
  38. if (buildParameters.BuildPipeline == EBuildPipeline.BuiltinBuildPipeline)
  39. {
  40. BuildLogger.Warning("推荐使用可编程构建管线(SBP)!");
  41. }
  42. #endif
  43. // 检测当前是否正在构建资源包
  44. if (BuildPipeline.isBuildingPlayer)
  45. throw new Exception("当前正在构建资源包,请结束后再试");
  46. // 检测是否有未保存场景
  47. if (EditorTools.HasDirtyScenes())
  48. throw new Exception("检测到未保存的场景文件");
  49. // 检测首包资源标签
  50. if (buildParameters.CopyBuildinFileOption == ECopyBuildinFileOption.ClearAndCopyByTags
  51. || buildParameters.CopyBuildinFileOption == ECopyBuildinFileOption.OnlyCopyByTags)
  52. {
  53. if (string.IsNullOrEmpty(buildParameters.CopyBuildinFileTags))
  54. throw new Exception("首包资源标签不能为空!");
  55. }
  56. // 检测共享资源打包规则
  57. if (buildParameters.SharedPackRule == null)
  58. throw new Exception("共享资源打包规则不能为空!");
  59. #if UNITY_WEBGL
  60. if (buildParameters.EncryptionServices != null)
  61. {
  62. if (buildParameters.EncryptionServices.GetType() != typeof(EncryptionNone))
  63. {
  64. throw new Exception("WebGL平台不支持加密!");
  65. }
  66. }
  67. #endif
  68. // 检测包裹输出目录是否存在
  69. string packageOutputDirectory = buildParametersContext.GetPackageOutputDirectory();
  70. if (Directory.Exists(packageOutputDirectory))
  71. throw new Exception($"本次构建的补丁目录已经存在:{packageOutputDirectory}");
  72. // 保存改动的资源
  73. AssetDatabase.SaveAssets();
  74. }
  75. if (buildParameters.BuildMode == EBuildMode.ForceRebuild)
  76. {
  77. string packageRootDirectory = buildParametersContext.GetPackageRootDirectory();
  78. if (EditorTools.DeleteDirectory(packageRootDirectory))
  79. {
  80. BuildLogger.Log($"删除包裹目录:{packageRootDirectory}");
  81. }
  82. }
  83. // 如果输出目录不存在
  84. string pipelineOutputDirectory = buildParametersContext.GetPipelineOutputDirectory();
  85. if (EditorTools.CreateDirectory(pipelineOutputDirectory))
  86. {
  87. BuildLogger.Log($"创建输出目录:{pipelineOutputDirectory}");
  88. }
  89. }
  90. }
  91. }