6.PowerSliderDrawer和IntRangeDrawer

6.自定义材质面板-自带Shader材质属性绘制类-PowerSliderDrawer和IntRangeDrawer


6.1 知识点

PowerSliderDrawer的使用

PowerSliderDrawer 是 Unity 自带的继承自 MaterialPropertyDrawer(材质属性绘制器)的类。使用它修饰属性,可以让该属性在 Inspector 窗口中显示为一个指数滑块。相比普通的线性滑块,它能够更方便地调整那些变化范围较大、非线性分布的参数。例如,当属性的值范围较大,但其效果在某些特定范围内特别敏感时,可以通过 PowerSlider 进行更直观的调整。

它与普通滑块属性的区别在于:

  • 普通滑块属性默认是线性分布,即滑块的位置与参数值成正比;
  • 而 PowerSlider 提供了非线性映射,适合用于参数值对效果影响不均匀的场景。

这种类可以用于修饰例如:

  • 光照强度:调整光的强弱(低强度时变化显著,高强度时变化较平滑);
  • 对比度:调整图像的对比效果;
  • 模糊程度:调整模糊范围,尤其适用于高斯模糊。

使用方式如下:

[PowerSlider(指数)] 属性名 ("显示名称", Range(最小值,最大值)) = 默认值

对应的函数曲线为:

  • y = x 的指数次方,其中 x 为滑块所在位置,y 为属性的数值。

声明一个二次方的指数滑块

Shader "Unlit/Lesson06_PowerSliderDrawerAndIntRangeDrawer"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        [PowerSlider(2)]_TestNum("TestNum", Range(0,1)) = 0
    }
    SubShader
    {
        //...
    }
}

查看效果

可以看到,当滑块数值为 0.5 时,其在进度条上大约位于 0.7 的位置,因为 0.7 的二次方约等于 0.5。

IntRangeDrawer的使用

IntRangeDrawer 同样是 Unity 自带的继承自 MaterialPropertyDrawer(材质属性绘制器)的类。使用它修饰属性,可以让该属性在 Inspector 窗口中显示为一个整数范围滑块。

使用方式如下:

[IntRange] 属性名 ("显示名称", Range(最小值,最大值)) = 默认值

声明一个整数滑块

Shader "Unlit/Lesson06_PowerSliderDrawerAndIntRangeDrawer"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        [PowerSlider(2)]_TestNum("TestNum", Range(0,1)) = 0
        [IntRange]_TestIntNum("TestIntNum", Range(0,10)) = 0
    }
    SubShader
    {
         //...
    }
}

查看效果

可以看到,这个滑块只能进行整数变化了。


6.2 知识点代码

Lesson06_PowerSliderDrawerAndIntRangeDrawer.shader

Shader "Unlit/Lesson06_PowerSliderDrawerAndIntRangeDrawer"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}

        [PowerSlider(2)]_TestNum("TestNum", Range(0,1)) = 0

        [IntRange]_TestIntNum("TestIntNum", Range(0,10)) = 0
    }
    SubShader
    {
        Tags
        {
            "RenderType"="Opaque"
        }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // make fog work
            #pragma multi_compile_fog

            #include "UnityCG.cginc"

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

            struct v2f
            {
                float2 uv : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                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);
                UNITY_TRANSFER_FOG(o, o.vertex);
                return o;
            }

            fixed4 frag(v2f i) : SV_Target
            {
                // sample the texture
                fixed4 col = tex2D(_MainTex, i.uv);
                // apply fog
                UNITY_APPLY_FOG(i.fogCoord, col);
                return col;
            }
            ENDCG
        }
    }
}

Lesson06_自定义材质面板_自带Shader材质属性绘制类_PowerSliderDrawer和IntRangeDrawer.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson06_自定义材质面板_自带Shader材质属性绘制类_PowerSliderDrawer和IntRangeDrawer : MonoBehaviour
{
    void Start()
    {
        #region 知识点一 PowerSliderDrawer的使用

        //作用:
        //PowerSliderDrawer是Unity自带的继承自MaterialPropertyDrawer(材质属性绘制器) 的类
        //使用它修饰属性,可以让该属性在Inspector窗口中显示为一个指数滑块
        //相比普通的线性滑块,它可以更方便的调整那些变化范围较大、非线性分布的参数
        //比如
        //当属性的值范围较大,但其效果对某些特定范围特别敏感时,可以通过 PowerSlider 进行更直观的调整

        //它和普通滑块属性的区别是:
        //普通滑块属性默认是线性分布,即滑块的位置与参数值成正比
        //PowerSlider 提供了 非线性映射,适合用在参数值对效果影响不均匀的场景
        //我们可以用该类修饰
        //1.光照强度: 调整光的强弱(低强度变化显著,高强度变化较平滑)。
        //2.对比度: 调整图像的对比效果。
        //3.模糊程度: 调整模糊范围,尤其是高斯模糊。
        //等等

        //使用方式:
        //[PowerSlider(指数)] 属性名 ("显示名称", Range(最小值,最大值)) = 默认值

        //对应的函数曲线为 
        //y = x的指数次方
        //x为滑块所在位置
        //y为属性的数值

        #endregion

        #region 知识点二 IntRangeDrawer的使用

        //作用:
        //IntRangeDrawer同样是Unity自带的继承自MaterialPropertyDrawer(材质属性绘制器) 的类
        //使用它修饰属性,可以让该属性在Inspector窗口中显示为一个整数范围滑块

        //使用方式:
        //[IntRange] 属性名 ("显示名称", Range(最小值,最大值)) = 默认值

        #endregion
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏