73 lines
3.1 KiB
C#
73 lines
3.1 KiB
C#
#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";
|
|
|
|
/// <summary>
|
|
/// 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"
|
|
/// </summary>
|
|
public static string FixQualityPipelines()
|
|
{
|
|
var log = new StringBuilder();
|
|
var names = QualitySettings.names;
|
|
UniversalRenderPipelineAsset fallback = AssetDatabase.LoadAssetAtPath<UniversalRenderPipelineAsset>(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<UniversalRenderPipelineAsset>(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<UniversalRenderPipelineAsset>(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
|