暫無描述
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

BuildTargetExtensions.cs 4.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. using JetBrains.Annotations;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Diagnostics.CodeAnalysis;
  5. using UnityEngine;
  6. using UnityEngine.Rendering;
  7. namespace UnityEditor.Rendering
  8. {
  9. /// <summary>
  10. /// Extensions for <see cref="BuildTarget"/>
  11. /// </summary>
  12. public static class BuildTargetExtensions
  13. {
  14. static bool NeedsToBeIncludedInBuildBylabel(RenderPipelineAsset asset, string label)
  15. {
  16. var labelList = AssetDatabase.GetLabels(asset);
  17. foreach (string item in labelList)
  18. {
  19. if (item == label)
  20. return true;
  21. }
  22. return false;
  23. }
  24. static void AddAdditionalRenderPipelineAssetsIncludedForBuild<T>(HashSet<T> assetsList)
  25. where T : RenderPipelineAsset
  26. {
  27. var includer = GraphicsSettings.GetRenderPipelineSettings<IncludeAdditionalRPAssets>();
  28. if (includer == null)
  29. return;
  30. bool includeSceneDependencies = includer.includeReferencedInScenes;
  31. bool includeAssetsWithLabel = includer.includeAssetsByLabel;
  32. string labelToInclude = includer.labelToInclude;
  33. if (!includeSceneDependencies && !includeAssetsWithLabel)
  34. return;
  35. using (ListPool<string>.Get(out var assetsPaths))
  36. {
  37. assetsPaths.AddRange(AssetDatabaseHelper.FindAssetPaths<T>(".asset"));
  38. if (includeSceneDependencies)
  39. {
  40. using (ListPool<string>.Get(out var scenesPaths))
  41. {
  42. foreach (var scene in EditorBuildSettings.scenes)
  43. if (scene.enabled)
  44. scenesPaths.Add(scene.path);
  45. // Get all enabled scenes path in the build settings.
  46. HashSet<string> depsHash = new HashSet<string>(AssetDatabase.GetDependencies(scenesPaths.ToArray()));
  47. for (int i = 0; i < assetsPaths.Count; ++i)
  48. {
  49. var assetPath = assetsPaths[i];
  50. if (depsHash.Contains(assetPath))
  51. assetsList.Add(AssetDatabase.LoadAssetAtPath<T>(assetPath));
  52. }
  53. }
  54. }
  55. if (includeAssetsWithLabel)
  56. {
  57. for (int i = 0; i < assetsPaths.Count; ++i)
  58. {
  59. // Add the assets that are labeled to be included
  60. var asset = AssetDatabase.LoadAssetAtPath<T>(assetsPaths[i]);
  61. if (NeedsToBeIncludedInBuildBylabel(asset, labelToInclude))
  62. assetsList.Add(asset);
  63. }
  64. }
  65. }
  66. }
  67. /// <summary>
  68. /// Obtains a list of the <see cref="RenderPipelineAsset"/> that are references into the settings either on <see cref="QualitySettings"/> or in <see cref="GraphicsSettings"/>
  69. /// </summary>
  70. /// <typeparam name="T">The type of <see cref="RenderPipelineAsset"/></typeparam>
  71. /// <param name="buildTarget">The <see cref="BuildTarget"/> to obtain the assets.</param>
  72. /// <param name="srpAssets">The output list of <see cref="RenderPipelineAsset"/> that are referenced by the platform.</param>
  73. /// <returns>false if there was an error fetching the <see cref="RenderPipelineAsset"/> for this <see cref="BuildTarget"/></returns>
  74. [MustUseReturnValue]
  75. public static bool TryGetRenderPipelineAssets<T>([DisallowNull] this BuildTarget buildTarget, List<T> srpAssets)
  76. where T : RenderPipelineAsset
  77. {
  78. if (srpAssets == null)
  79. return false;
  80. var activeBuildTargetGroup = BuildPipeline.GetBuildTargetGroup(buildTarget);
  81. var activeBuildTargetGroupName = activeBuildTargetGroup.ToString();
  82. QualitySettings.GetRenderPipelineAssetsForPlatform<T>(activeBuildTargetGroupName, out var buildPipelineAssets, out var allQualityLevelsAreOverriden);
  83. bool noQualityLevels = QualitySettings.GetActiveQualityLevelsForPlatformCount(activeBuildTargetGroupName) == 0;
  84. if (noQualityLevels || !allQualityLevelsAreOverriden)
  85. {
  86. // We need to check the fallback cases
  87. if (GraphicsSettings.defaultRenderPipeline is T srpAsset)
  88. buildPipelineAssets.Add(srpAsset);
  89. }
  90. if (buildPipelineAssets.Count != 0)
  91. AddAdditionalRenderPipelineAssetsIncludedForBuild(buildPipelineAssets);
  92. srpAssets.AddRange(buildPipelineAssets);
  93. return srpAssets.Count != 0;
  94. }
  95. }
  96. }