版本: Unity 6 (6000.0)
语言英语
  • C#

MaterialPropertyDrawer

UnityEditor 中的类

建议更改

成功!

感谢您帮助我们提高 Unity 文档的质量。虽然我们不能接受所有提交的内容,但我们会阅读用户提出的每个建议更改,并在适用时进行更新。

关闭

提交失败

由于某种原因,您的建议更改无法提交。请<a>稍后再试</a>。感谢您抽出时间帮助我们提高 Unity 文档的质量。

关闭

取消

描述

派生自定义材质属性抽屉的基类。

使用它为您的材质属性创建自定义 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。