派生自定义材质属性抽屉的基类。
使用它为您的材质属性创建自定义 UI 抽屉,而无需编写自定义的 MaterialEditor 类。这类似于 PropertyDrawer 如何在不编写自定义检查器的情况下启用自定义 UI。
在着色器代码中,可以在着色器属性前面使用类似 C# 的属性语法来向它们添加抽屉。Unity 有几个内置的抽屉,您也可以编写自己的抽屉。以下是一个演示语法的着色器代码片段
Shader "Custom/Example" { Properties { _MainTex("Base (RGB)", 2D) = "white" {}
// Display a popup with None,Add,Multiply choices, // and setup corresponding shader keywords. [KeywordEnum(None, Add, Multiply)] _Overlay("Overlay mode", Float) = 0
_OverlayTex("Overlay", 2D) = "black" {}
// Display as a toggle. [Toggle] _Invert("Invert color?", Float) = 0 }
// rest of shader code... }
在实现您自己的抽屉时,您应该重写 OnGUI 函数。您还可以选择重写 GetPropertyHeight 和 Apply 函数。以下是一个属性抽屉的示例,它为浮点属性显示一个复选框,该复选框的值根据状态设置为 0 或 1
using UnityEngine; using UnityEditor; using System;
// The property drawer class should be placed in an editor script, inside a folder called Editor. // Use with "[MyToggle]" before a float shader property.
public class MyToggleDrawer : MaterialPropertyDrawer { // Draw the property inside the given rect public override void OnGUI (Rect position, MaterialProperty prop, String label, MaterialEditor editor) { // Setup bool value = (prop.floatValue != 0.0f);
EditorGUI.BeginChangeCheck(); EditorGUI.showMixedValue = prop.hasMixedValue;
// Show the toggle control value = EditorGUI.Toggle(position, label, value);
EditorGUI.showMixedValue = false; if (EditorGUI.EndChangeCheck()) { // Set the new value if it has changed prop.floatValue = value ? 1.0f : 0.0f; } } }
内置的 MaterialPropertyDrawers 包括:ToggleDrawer、ToggleOffDrawer、KeywordEnumDrawer、EnumDrawer、PowerSliderDrawer、IntRangeDrawer。在着色器代码中,类名的“Drawer”后缀不会被写入;当 Unity 搜索抽屉类时,它会自动添加“Drawer”。
Toggle 允许您启用或禁用单个着色器关键字。它使用一个浮点数来存储着色器关键字的状态,并将其显示为一个切换按钮。启用切换按钮时,Unity 会启用着色器关键字;禁用切换按钮时,Unity 会禁用着色器关键字。
如果您指定一个关键字名称,则切换按钮会影响具有该名称的着色器关键字。如果您没有指定着色器关键字名称,则切换按钮会影响具有名称 (uppercase property name)_ON
的着色器关键字。
// This version specifies a keyword name. // The material property name is not important. // When the toggle is enabled, Unity enables a shader keyword with the name "ENABLE_EXAMPLE_FEATURE". // When the toggle is disabled, Unity disables a shader keyword with the name "ENABLE_EXAMPLE_FEATURE". [Toggle(ENABLE_EXAMPLE_FEATURE)] _ExampleFeatureEnabled ("Enable example feature", Float) = 0
// This version does not specify a keyword name. // The material property name determines the shader keyword it affects. // When this toggle is enabled, Unity enables a shader keyword with the name "_ANOTHER_FEATURE_ON". // When this toggle is disabled, Unity disables a shader keyword with the name "_ANOTHER_FEATURE_ON". [Toggle] _Another_Feature ("Enable another feature", Float) = 0
// ...Later, in the HLSL code: #pragma multi_compile __ ENABLE_EXAMPLE_FEATURE #pragma multi_compile __ _ANOTHER_FEATURE_ON
ToggleOff 类似于 Toggle,但是启用切换按钮时,Unity 会禁用着色器关键字;禁用切换按钮时,Unity 会启用着色器关键字。此外,当您没有指定着色器关键字名称时,默认名称为 (uppercase property name)_OFF
。ToggleOff
可用于向现有着色器添加功能和切换按钮,同时保持向后兼容性。
// This version specifies a keyword name. // The material property name is not important. // When the toggle is enabled, Unity disables a shader keyword with the name "DISABLE_EXAMPLE_FEATURE". // When the toggle is disabled, Unity enables a shader keyword with the name "DISABLE_EXAMPLE_FEATURE". [ToggleOff(DISABLE_EXAMPLE_FEATURE)] _ExampleFeatureEnabled ("Enable example feature", Float) = 0
// This version does not specify a keyword name. // The material property name determines the shader keyword it affects. // When this toggle is enabled, Unity disables a shader keyword with the name "_ANOTHER_FEATURE_OFF". // When this toggle is disabled, Unity enables a shader keyword with the name "_ANOTHER_FEATURE_OFF". [ToggleOff] _Another_Feature ("Enable another feature", Float) = 0
// ...Later, in the HLSL code: #pragma multi_compile __ DISABLE_EXAMPLE_FEATURE #pragma multi_compile __ _ANOTHER_FEATURE_OFF
KeywordEnum 允许您选择要启用的着色器关键字集中的哪一个。它将浮点数显示为弹出菜单,浮点数的值决定了 Unity 启用的着色器关键字。Unity 会启用名称为 (uppercase property name)_(uppercase enum value name)
的着色器关键字。最多可以提供 9 个名称。
// Display a popup with None, Add, Multiply choices. // Each option will set _OVERLAY_NONE, _OVERLAY_ADD, _OVERLAY_MULTIPLY shader keywords. [KeywordEnum(None, Add, Multiply)] _Overlay ("Overlay mode", Float) = 0
// ...Later, in the HLSL code: #pragma multi_compile _OVERLAY_NONE _OVERLAY_ADD _OVERLAY_MULTIPLY
Enum 为浮点属性显示弹出菜单。您可以提供枚举类型名称(最好是使用命名空间完全限定的,以防存在多个类型),或者提供明确的名称/值对以显示。最多可以指定 7 个名称/值对。
// Blend mode values [Enum(UnityEngine.Rendering.BlendMode)] _Blend ("Blend mode", Float) = 1
// A subset of blend mode values, just "One" (value 1) and "SrcAlpha" (value 5). [Enum(One,1,SrcAlpha,5)] _Blend2 ("Blend mode subset", Float) = 1
PowerSlider 为 Range 着色器属性显示具有非线性响应的滑块。
// A slider with 3.0 response curve [PowerSlider(3.0)] _Shininess ("Shininess", Range (0.01, 1)) = 0.08
IntRange 为 Range 着色器属性显示一个整数滑块。
// An integer slider for specified range (0 to 255) [IntRange] _Alpha ("Alpha", Range (0, 255)) = 100
当属性抽屉类名以“Decorator”结尾时,它就是一个属性装饰器,类似于 DecoratorDrawer。它们用于在不影响属性本身的情况下,在属性之间创建标题和分隔线。单个属性可以具有多个装饰器。内置的装饰器抽屉包括:SpaceDecorator、HeaderDecorator。
Space 在着色器属性之前创建垂直空间。
// Default small amount of space. [Space] _Prop1 ("Prop1", Float) = 0
// Large amount of space. [Space(50)] _Prop2 ("Prop2", Float) = 0
Header 在着色器属性之前创建标题文本。
[Header(A group of things)] _Prop1 ("Prop1", Float) = 0
请注意,出于性能原因,EditorGUILayout 函数不能与 MaterialPropertyDrawers 一起使用。
其他资源: MaterialProperty 类。
Apply | 将额外的初始值应用于材质。 |
GetPropertyHeight | 重写此方法以指定此属性的 GUI 的高度(以像素为单位)。 |
OnGUI | 重写此方法以创建您自己的属性 GUI。 |