Version: 5.4 (switch to 5.5b)
言語English
  • C#
  • JS

Script language

Select your preferred scripting language. All code snippets will be displayed in this language.

MaterialPropertyDrawer

class in UnityEditor

Suggest a change

Success!

Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable.

Close

Sumbission failed

For some reason your suggested change could not be submitted. Please try again in a few minutes. And thank you for taking the time to help us improve the quality of Unity Documentation.

Close

Cancel

マニュアルに切り替える

Description

プロパティー Drawer の派生元ベースクラス

これを使用して自身のマテリアルプロパティーのためのカスタム UI Drawer を、カスタムの MaterialEditor クラスを記述することなく、作成できます。このクラスは PropertyDrawer がカスタムのインスペクターを記述することなくカスタム UI を可能にする方法に似ています。

シェーダーコードでは C# のような属性の文法を、シェーダープロパティーの前に使用して Drawer を追加できます。Unity にはいくつかのビルトインの Drawer があり、自身で記述することもできます。次にシンタックスを示すシェーダーコードのスニペットを示します。

          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... }
          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... }

自身の Drawer を実装するとき、OnGUI 関数をオーバーライドする必要があります。実装で異なる値やビヘイビアが必用な場合は、さらにオプションで GetPropertyHeight および Apply 関数をオーバーライドすることができます。次のサンプルでは、プロパティー Drawer により、状態にもとづき値を 0 または 1 に設定して float プロパティーのチェックボックスを表示します。

no example available in JavaScript
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。シェーダーコードでは、クラス名の末尾の "Drawer" 修飾子は異彩されません。Unity が Drawer クラスを検索したとき、自動的に "Drawer" を付加します。

Toggle により float をトグルとして表示します。プロパティーの値はトグルの状態により 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
// 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 により 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) = 1
// 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 により float プロパティーにポップアップメニューを表示して、対応するシェーダーキーワードを有効化します。これはシェーダーにおいて、シェーダーコードの一部を有効化 / 無効化するために "#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 // ...
// 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 シェーダープロパティーに対する線形でない反応曲線のスライダーを表示します。

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

Property Drawer クラス名が "Decorator" で終わるとき、DecoratorDrawer に似た Decorator の性質を持ちます。 Decorator は、ヘッダーを作成したり、プロパティーの間に影響のない仕切りを入れることができます。1つのプロパティーに対して複数の Decorator を持つことができます。ビルトインとして SpaceDecorator と HeaderDecorator が実装されています。

Space によりシェーダープロパティーの前に垂直方向のスペースを作成します。

// Default small amount of space.
[Space] _Prop1 ("Prop1", Float) = 0

// Large amount of space. [Space(50)] _Prop2 ("Prop2", Float) = 0
// 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
[Header(A group of things)] _Prop1 ("Prop1", Float) = 0

パフォーマンス上の理由により、EditorGUILayout 関数は MaterialPropertyDrawer では使用できません。

関連項目: MaterialProperty クラス

Public Functions

Applyマテリアルに追加の初期値を適用します
GetPropertyHeightGUI の高さを指定するにはこのメソッドのプロパティーをピクセル単位でオーバーライドします
OnGUIこのメソッドをオーバーライドしてプロパティーに自身の GUI を作成します