You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

代码修改Quality Settings(高→低)后UI元素未生效,如何同步设置?

让UI随Quality Settings同步调整的解决方案

Unity默认的Quality Settings仅影响3D场景的渲染参数(如纹理分辨率、阴影质量等),并不会直接作用于Canvas内的UI元素,你可以通过以下几种方式实现UI的同步适配:

  • 监听画质切换事件,手动调整UI属性
    利用Unity提供的QualitySettings.currentQualityChanged事件,在画质等级变更时,根据新等级修改UI的关键参数:
    • 切换不同分辨率的UI图集:提前准备高/低分辨率的UI资源,切换时加载对应图集替换现有UI纹理
    • 调整Canvas缩放比例:低画质下降低Canvas.scaleFactor,减少UI渲染开销
    • 替换UI材质:给UI使用适配不同画质的材质,比如低画质下启用纹理压缩

示例代码:

private void OnEnable()
{
    QualitySettings.currentQualityChanged += HandleQualityChange;
    // 初始化时应用当前画质设置
    HandleQualityChange(QualitySettings.GetQualityLevel());
}

private void OnDisable()
{
    QualitySettings.currentQualityChanged -= HandleQualityChange;
}

private void HandleQualityChange(int newQualityLevel)
{
    switch (newQualityLevel)
    {
        case 0: // 低画质等级
            // 加载低分辨率UI图集
            UIManager.Instance.SwitchToLowResAtlas();
            // 调整Canvas缩放
            GetComponent<Canvas>().scaleFactor = 0.75f;
            break;
        case 2: // 高画质等级
            UIManager.Instance.SwitchToHighResAtlas();
            GetComponent<Canvas>().scaleFactor = 1f;
            break;
        // 其他画质等级可按需扩展
    }
}
  • 结合动态分辨率功能适配UI
    开启Unity的Dynamic Resolution(在Project Settings > Graphics中启用),并在Quality Settings里为不同等级配置对应的分辨率缩放比例。配合Canvas Scaler的Scale With Screen Size模式,UI会自动跟随整体分辨率的调整适配显示效果。

  • 在UI Shader中动态适配画质
    如果使用自定义UI Shader,可以在Shader中获取当前Quality等级,动态调整纹理采样的Mip层级或压缩格式,让UI纹理随画质等级自动降质:

Shader "Custom/QualityAdaptiveUIShader"
{
    Properties
    {
        _MainTex ("Base Texture", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "Queue"="Transparent" "RenderType"="Transparent" "IgnoreProjector"="True" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                // 根据画质等级选择Mip层级
                int quality = QualitySettings.GetQualityLevel();
                float mipOffset = quality <= 1 ? 2.0f : 0.0f; // 低画质用第2级Mip
                fixed4 col = tex2Dlod(_MainTex, float4(i.uv, 0.0f, mipOffset));
                return col;
            }
            ENDCG
        }
    }
}
  • AssetBundle分画质加载UI资源
    将不同画质的UI资源(如高/低清图集、简化版UI预制体)分别打包为AssetBundle,切换画质时卸载当前UI资源,加载对应画质的版本。这种方式适合UI资源差异较大的场景。

内容的提问来源于stack exchange,提问作者Hasnain Shaukat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 02:35:20