MaterialPropertyDrawer

class in UnityEditor

Switch to Manual

Description

用于派生自定义材质属性绘制器的基类。

使用此基类为您的材质属性创建自定义 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; } } }

内置的 MaterialPropertyDrawer 有:ToggleDrawer、EnumDrawer、KeywordEnumDrawer、PowerSliderDrawer 和 IntRangeDrawer。在着色器代码中,未写入类名称的“Drawer”后缀;Unity 搜索绘制器类时,会自动添加“Drawer”。

Toggle 将以开关形式显示浮点值。属性值为 0 或 1,具体取决于开关状态。当开关处于打开状态时,将设置一个带有大写属性名称 +“_ON”的着色器关键字,或者一个显式指定的着色器关键字。

// Will set "_INVERT_ON" shader keyword when set
[Toggle] _Invert ("Invert?", Float) = 0

// Will set "ENABLE_FANCY" shader keyword when set. [Toggle(ENABLE_FANCY)] _Fancy ("Fancy?", Float) = 0

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

KeywordEnum 显示与浮点属性对应的弹出菜单,并启用相应的着色器关键字。它可在着色器中与“#pragma multi_compile”配合使用,以启用或禁用部分着色器代码。每个名称都将 采用“属性名”+ 下划线 +“枚举名”这种形式的大写着色器关键字。最多可提供 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 on in CGPROGRAM code: #pragma multi_compile _OVERLAY_NONE _OVERLAY_ADD _OVERLAY_MULTIPLY // ...

PowerSlider 显示一个具有对应于 Range 着色器属性的非线性响应的滑动条。

// 带有 3.0 响应曲线的滑动条
[PowerSlider(3.0)] _Shininess ("Shininess", Range (0.01, 1)) = 0.08

IntRange 显示一个适用于 Range 着色器属性的整数滑动条。

// 适用于指定范围的整数滑动条(0 到 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 类。

Public Functions

Apply将额外的初始值应用于该材质。
GetPropertyHeight重写此方法,以指定此属性的 GUI 的高度(以像素为单位)。
OnGUI重写此方法,以针对该属性创建您自己的 GUI。