MaterialPropertyDrawer
класс в UnityEditor
Описание
Базовый класс, от которого наследуются пользовательские отрисовщики свойств материала.
Используйте это для создания пользовательских ящиков UI для свойств вашего материала, без необходимости писать пользовательские классы MaterialEditor. Это похоже на то, как PropertyDrawer позволяет использовать пользовательские UI без написания пользовательских инспекторов.
В коде шейдера синтаксис атрибута C#-like может быть использован перед свойствами шейдера для добавления ящиков к ним. 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. Вот пример отрисовщика свойства, который показывает флажок для свойства типа float, задавая значение 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, ToggleOffDrawer, KeywordEnumDrawer, EnumDrawer, PowerSliderDrawer, IntRangeDrawer. В коде шейдера суффикс «Drawer» в имени класса не пишется: при поиске класса отрисовщика Unity добавляет его автоматически.
Переключить позволяет включить или отключить одно ключевое слово шейдера. Для хранения состояния ключевого слова шейдера используется float, а отображается оно как переключатель. Когда переключатель включён, 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 похож на Переключить, но когда переключатель включён, Unity отключает ключевое слово shader; когда переключатель отключен, Unity включает ключевое слово shader. Кроме того, имя по умолчанию, когда вы не указываете ключевое слово shader, — (uppercase property name)_OFF.ToggleOff может быть полезным для добавления функций и переключателей к существующим shader, сохраняя обратную совместимость.
// 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
Энум показывает всплывающее меню для свойства типа float. Вы можете указать имя перечислимого типа (желательно полное, с пространствами имён, если типов несколько) либо явные пары «имя — значение». Задать можно до 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) = 1PowerSlider отображает ползунок с нелинейной реакцией на свойство шейдера Range.
// A slider with 3.0 response curve
[PowerSlider(3.0)] _Shininess ("Shininess", Range (0.01, 1)) = 0.08IntRange отображает ползунок с целым числом для свойства шейдера Range.
// An integer slider for specified range (0 to 255)
[IntRange] _Alpha ("Alpha", Range (0, 255)) = 100Если имя класса отрисовщика свойства оканчивается на «Decorator», это декоратор свойства, аналогичный DecoratorDrawerОни используются для создания заголовков и разделителей между свойствами, которые не влияют на само свойство. Одно свойство может иметь несколько декораторов. Встроенные ящики декораторов: SpaceDecorator, HeaderDecorator.
Космос создает вертикальное пространство перед свойством shader.
// Default small amount of space. [Space] _Prop1 ("Prop1", Float) = 0
// Large amount of space. [Space(50)] _Prop2 ("Prop2", Float) = 0
Header создает текст заголовка перед свойством shader.
[Header(A group of things)] _Prop1 ("Prop1", Float) = 0Обратите внимание, что по причинам производительности функции EditorGUILayout не могут использоваться с MaterialPropertyDrawers.
Дополнительные ресурсы: MaterialProperty class.
Открытые методы
| Метод | Описание |
|---|---|
| Apply | Применить дополнительные начальные значения к материалу. |
| GetPropertyHeight | Переопределите этот метод, чтобы указать высоту GUI для этого свойства в пикселях. |
| OnGUI | Переопределите этот метод, чтобы создать свой собственный GUI для свойства. |