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

スクリプト言語

好きな言語を選択してください。選択した言語でスクリプトコードが表示されます。

MaterialPropertyDrawer

class in UnityEditor

フィードバック

ありがとうございます

この度はドキュメントの品質向上のためにご意見・ご要望をお寄せいただき、誠にありがとうございます。頂いた内容をドキュメントチームで確認し、必要に応じて修正を致します。

閉じる

送信に失敗しました

なんらかのエラーが発生したため送信が出来ませんでした。しばらく経ってから<a>もう一度送信</a>してください。ドキュメントの品質向上のために時間を割いて頂き誠にありがとうございます。

閉じる

キャンセル

マニュアルに切り替える

説明

プロパティー 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 により 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、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 の性質を持ちます。\n 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 関数

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