Unity-Technologies/UnityCsReference · error · ArgumentException

TierSettings.renderingPath must be actual rendering path (no

Error message

TierSettings.renderingPath must be actual rendering path (not UsePlayerSettings)

What it means

Thrown by EditorGraphicsSettings.SetTierSettings when the supplied TierSettings.renderingPath equals RenderingPath.UsePlayerSettings. Tier settings are an explicit, per-tier override, so 'UsePlayerSettings' is a non-answer at this level and would create a meaningless self-reference; the API rejects it.

Source

Thrown at Editor/Mono/EditorGraphicsSettings.cs:77

        public bool             detailNormalMap;

        public bool             cascadedShadowMaps;
        public bool             prefer32BitShadowMaps;
        public bool             enableLPPV;
        public bool             semitransparentShadows;

        public RenderingPath    renderingPath;
        public RealtimeGICPUUsage realtimeGICPUUsage;
    }

    public sealed partial class EditorGraphicsSettings
    {
        // Use the version with NamedBuildTarget passed instead.
        // [Obsolete("Use SetTierSettings() instead (UnityUpgradable) -> SetTierSettings(*)", false)]
        public static void SetTierSettings(BuildTargetGroup target, GraphicsTier tier, TierSettings settings)
        {
            if (settings.renderingPath == RenderingPath.UsePlayerSettings)
                throw new ArgumentException("TierSettings.renderingPath must be actual rendering path (not UsePlayerSettings)", "settings");

            SetTierSettingsImpl(target, tier, settings);
            MakeTierSettingsAutomatic(target, tier, false);
            OnUpdateTierSettings(target, true);
        }

        public static void SetTierSettings(NamedBuildTarget target, GraphicsTier tier, TierSettings settings) => SetTierSettings(target.ToBuildTargetGroup(), tier, settings);
    }


    //
    // deprecated
    //

    [Obsolete("Use TierSettings instead (UnityUpgradable) -> UnityEditor.Rendering.TierSettings", false)]
    [StructLayout(LayoutKind.Sequential)]
    public struct PlatformShaderSettings
    {

View on GitHub (pinned to 225b0fbdb5)

Solutions

  1. Set settings.renderingPath to a concrete RenderingPath value (e.g. Deferred, Forward, VertexLit) before calling SetTierSettings.
  2. Read the current tier settings via GetTierSettings, modify only the fields you intend, then write back so renderingPath is already concrete.
  3. Validate the enum against the allowed subset before the call.

Example fix

// before
var ts = new TierSettings { /* renderingPath defaults to UsePlayerSettings */ };
EditorGraphicsSettings.SetTierSettings(target, tier, ts);

// after
var ts = EditorGraphicsSettings.GetTierSettings(target, tier);
ts.renderingPath = RenderingPath.Deferred;
EditorGraphicsSettings.SetTierSettings(target, tier, ts);
Defensive patterns

Strategy: validation

Validate before calling

if (settings.renderingPath == RenderingPath.UsePlayerSettings) { settings.renderingPath = RenderingPath.Forward; /* pick a concrete default */ }

Type guard

static bool IsValidTierRenderingPath(RenderingPath p) => p != RenderingPath.UsePlayerSettings;

Prevention

When it happens

Trigger: Building TierSettings programmatically and leaving renderingPath at its default (which is UsePlayerSettings) before calling SetTierSettings. Also copying tier settings from a player-settings-derived struct without overriding the path.

Common situations: Editor scripts that programmatically configure graphics tiers for build presets; tooling that snapshots and reapplies tier settings; default-constructed TierSettings passed without field initialization.

Related errors


AI-assisted analysis of Unity-Technologies/UnityCsReference@225b0fbdb5 (2026-08-13). Data as JSON: /api/errors/4966d67a3a207643. Report an issue: GitHub.