TaskUpdateBundleInfo.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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 TaskUpdateBundleInfo : IBuildTask
  10. {
  11. void IBuildTask.Run(BuildContext context)
  12. {
  13. var buildParametersContext = context.GetContextObject<BuildParametersContext>();
  14. var buildMapContext = context.GetContextObject<BuildMapContext>();
  15. string pipelineOutputDirectory = buildParametersContext.GetPipelineOutputDirectory();
  16. string packageOutputDirectory = buildParametersContext.GetPackageOutputDirectory();
  17. int outputNameStyle = (int)buildParametersContext.Parameters.OutputNameStyle;
  18. // 1.检测文件名长度
  19. foreach (var bundleInfo in buildMapContext.Collection)
  20. {
  21. // NOTE:检测文件名长度不要超过260字符。
  22. string fileName = bundleInfo.BundleName;
  23. if (fileName.Length >= 260)
  24. throw new Exception($"The output bundle name is too long {fileName.Length} chars : {fileName}");
  25. }
  26. // 2.更新构建输出的文件路径
  27. foreach (var bundleInfo in buildMapContext.Collection)
  28. {
  29. if (bundleInfo.IsEncryptedFile)
  30. bundleInfo.BundleInfo.BuildOutputFilePath = bundleInfo.EncryptedFilePath;
  31. else
  32. bundleInfo.BundleInfo.BuildOutputFilePath = $"{pipelineOutputDirectory}/{bundleInfo.BundleName}";
  33. }
  34. // 3.更新文件其它信息
  35. foreach (var bundleInfo in buildMapContext.Collection)
  36. {
  37. string buildOutputFilePath = bundleInfo.BundleInfo.BuildOutputFilePath;
  38. bundleInfo.BundleInfo.ContentHash = GetBundleContentHash(bundleInfo, context);
  39. bundleInfo.BundleInfo.FileHash = GetBundleFileHash(buildOutputFilePath, buildParametersContext);
  40. bundleInfo.BundleInfo.FileCRC = GetBundleFileCRC(buildOutputFilePath, buildParametersContext);
  41. bundleInfo.BundleInfo.FileSize = GetBundleFileSize(buildOutputFilePath, buildParametersContext);
  42. }
  43. // 4.更新补丁包输出的文件路径
  44. foreach (var bundleInfo in buildMapContext.Collection)
  45. {
  46. string fileExtension = ManifestTools.GetRemoteBundleFileExtension(bundleInfo.BundleName);
  47. string fileName = ManifestTools.GetRemoteBundleFileName(outputNameStyle, bundleInfo.BundleName, fileExtension, bundleInfo.BundleInfo.FileHash);
  48. bundleInfo.BundleInfo.PackageOutputFilePath = $"{packageOutputDirectory}/{fileName}";
  49. }
  50. }
  51. private string GetBundleContentHash(BuildBundleInfo bundleInfo, BuildContext context)
  52. {
  53. var buildParametersContext = context.GetContextObject<BuildParametersContext>();
  54. var parameters = buildParametersContext.Parameters;
  55. var buildMode = parameters.BuildMode;
  56. if (buildMode == EBuildMode.DryRunBuild || buildMode == EBuildMode.SimulateBuild)
  57. return "00000000000000000000000000000000"; //32位
  58. if (bundleInfo.IsRawFile)
  59. {
  60. string filePath = bundleInfo.BundleInfo.BuildOutputFilePath;
  61. return HashUtility.FileMD5(filePath);
  62. }
  63. if (parameters.BuildPipeline == EBuildPipeline.BuiltinBuildPipeline)
  64. {
  65. var buildResult = context.GetContextObject<TaskBuilding.BuildResultContext>();
  66. var hash = buildResult.UnityManifest.GetAssetBundleHash(bundleInfo.BundleName);
  67. if (hash.isValid)
  68. return hash.ToString();
  69. else
  70. throw new Exception($"Not found bundle in build result : {bundleInfo.BundleName}");
  71. }
  72. else if (parameters.BuildPipeline == EBuildPipeline.ScriptableBuildPipeline)
  73. {
  74. // 注意:当资源包的依赖列表发生变化的时候,ContentHash也会发生变化!
  75. var buildResult = context.GetContextObject<TaskBuilding_SBP.BuildResultContext>();
  76. if (buildResult.Results.BundleInfos.TryGetValue(bundleInfo.BundleName, out var value))
  77. return value.Hash.ToString();
  78. else
  79. throw new Exception($"Not found bundle in build result : {bundleInfo.BundleName}");
  80. }
  81. else
  82. {
  83. throw new System.NotImplementedException();
  84. }
  85. }
  86. private string GetBundleFileHash(string filePath, BuildParametersContext buildParametersContext)
  87. {
  88. var buildMode = buildParametersContext.Parameters.BuildMode;
  89. if (buildMode == EBuildMode.DryRunBuild || buildMode == EBuildMode.SimulateBuild)
  90. return "00000000000000000000000000000000"; //32位
  91. else
  92. return HashUtility.FileMD5(filePath);
  93. }
  94. private string GetBundleFileCRC(string filePath, BuildParametersContext buildParametersContext)
  95. {
  96. var buildMode = buildParametersContext.Parameters.BuildMode;
  97. if (buildMode == EBuildMode.DryRunBuild || buildMode == EBuildMode.SimulateBuild)
  98. return "00000000"; //8位
  99. else
  100. return HashUtility.FileCRC32(filePath);
  101. }
  102. private long GetBundleFileSize(string filePath, BuildParametersContext buildParametersContext)
  103. {
  104. var buildMode = buildParametersContext.Parameters.BuildMode;
  105. if (buildMode == EBuildMode.DryRunBuild || buildMode == EBuildMode.SimulateBuild)
  106. return 0;
  107. else
  108. return FileUtility.GetFileSize(filePath);
  109. }
  110. }
  111. }