Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты

MaterialPropertyDrawer

класс в UnityEditor

Описание

Базовый класс, из которого создаются ящики с пользовательскими свойствами материала.

Используйте это для создания пользовательских ящиков пользовательского интерфейса для ваших свойств материалов без необходимости писать собственные классы MaterialEditor. Это похоже на то, как PropertyDrawer включает настраиваемый пользовательский интерфейс без написания настраиваемых инспекторов.

В коде шейдера перед свойствами шейдера можно использовать синтаксис атрибутов, подобный 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, ToggleOffDrawer, KeywordEnumDrawer, EnumDrawer, PowerSliderDrawer, IntRangeDrawer. В коде шейдера суффикс «Drawer» имени класса не пишется; когда Unity ищет класс ящика, он автоматически добавляет «Ящик».

Toggle позволяет включать или отключать одно ключевое слово шейдера. Он использует число с плавающей запятой для хранения состояния ключевого слова шейдера и отображает его как переключатель. Когда переключатель включен, Unity включает ключевое слово шейдера; когда переключатель отключен, Unity отключает ключевое слово шейдера.

Если вы укажете имя ключевого слова, переключатель повлияет на ключевое слово шейдера с таким именем. Если вы не укажете ключевое слово шейдера, переключатель повлияет на ключевое слово шейдера с именем (имя свойства в верхнем регистре)_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 включает ключевое слово шейдера. Кроме того, если вы не укажете имя ключевого слова шейдера, по умолчанию используется имя (имя свойства в верхнем регистре)_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 включает ключевое слово шейдера с именем (имя свойства в верхнем регистре)_(имя значения перечисления в верхнем регистре). Можно указать до 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 отображает ползунок с нелинейным откликом для свойства шейдера диапазона.

// A slider with 3.0 response curve [PowerSlider(3.0)] _Shininess ("Shininess", Range (0.01, 1)) = 0.08

IntRange отображает целочисленный ползунок для свойства шейдера диапазона.

// 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(A group of things)] _Prop1 ("Prop1", Float) = 0

Обратите внимание, что из соображений производительности функции EditorGUILayout нельзя использовать с MaterialPropertyDrawers.

Смотрите так же: MaterialProperty class.

Публичные Методы

Apply Применяет к материалу дополнительные начальные значения.
GetPropertyHeight Переопределяет этот метод, чтобы указать высоту графического интерфейса для этого свойства в пикселях.
OnGUI Переопределяет этот метод, чтобы создать собственный графический интерфейс для свойства.
Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
API скрипты 2021.3