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