#if UNITY_EDITOR using System.Text; using UnityEditor; using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Rendering.Universal; public static class SetupUrp { // Map Quality level name -> URP asset under Assets/Settings/URP static readonly (string qualityName, string assetPath)[] QualityPipelineMap = { ("Very Low", "Assets/Settings/URP/UniversalRP-0VeryLowQuality.asset"), ("Low", "Assets/Settings/URP/UniversalRP-1LowQuality.asset"), ("Medium", "Assets/Settings/URP/UniversalRP-2MediumQuality.asset"), ("High", "Assets/Settings/URP/UniversalRP-3HighQuality.asset"), ("Very High", "Assets/Settings/URP/UniversalRP-4VeryHighQuality.asset"), ("Ultra", "Assets/Settings/URP/UniversalRP-4VeryHighQuality.asset"), }; const string FallbackPipeline = "Assets/Settings/URP/UniversalRP-3HighQuality.asset"; /// /// Assign a URP asset to every Quality level and set Graphics default pipeline. /// Fixes: "platforms have assets in its associated Quality levels that belong to different render pipelines" /// public static string FixQualityPipelines() { var log = new StringBuilder(); var names = QualitySettings.names; UniversalRenderPipelineAsset fallback = AssetDatabase.LoadAssetAtPath(FallbackPipeline); if (fallback == null) return "ERROR: missing fallback URP asset at " + FallbackPipeline; for (int i = 0; i < names.Length; i++) { var path = ResolvePipelinePath(names[i]); var asset = AssetDatabase.LoadAssetAtPath(path) ?? fallback; QualitySettings.SetQualityLevel(i, applyExpensiveChanges: false); QualitySettings.renderPipeline = asset; log.AppendLine($"{i}:{names[i]} -> {AssetDatabase.GetAssetPath(asset)}"); } // Prefer High-tier as project default (Graphics Settings) GraphicsSettings.renderPipelineAsset = AssetDatabase.LoadAssetAtPath(FallbackPipeline) ?? fallback; // Restore previous current quality if possible, else Ultra/last int restore = System.Array.IndexOf(names, "Ultra"); if (restore < 0) restore = names.Length - 1; QualitySettings.SetQualityLevel(restore, applyExpensiveChanges: true); AssetDatabase.SaveAssets(); EditorUtility.SetDirty(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/QualitySettings.asset")[0]); log.AppendLine("Graphics default -> " + AssetDatabase.GetAssetPath(GraphicsSettings.renderPipelineAsset)); log.AppendLine("Current quality -> " + QualitySettings.names[QualitySettings.GetQualityLevel()]); return log.ToString(); } static string ResolvePipelinePath(string qualityName) { foreach (var entry in QualityPipelineMap) { if (entry.qualityName == qualityName) return entry.assetPath; } return FallbackPipeline; } public static string Execute() => FixQualityPipelines(); } #endif