プロパティ 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... }
自身の Drawer を実装するとき、OnGUI 関数をオーバーライドすべきです。さらにGetPropertyHeight および Apply 関数のオーバーライドするオプションがあります。次のサンプルでは、プロパティ Drawer により float プロパティのチェックボックスを表示したうえ、状態にもとづき値を 0 または 1 にセットします。
// The property drawer class should be placed in an editor script, inside a folder called Editor. // Use with "[MyToggle]" before a float shader property class MyToggleDrawer extends MaterialPropertyDrawer { // Draw the property inside the given rect function OnGUI (position : Rect, prop : MaterialProperty, label : String, editor : MaterialEditor) { // Setup EditorGUI.BeginChangeCheck (); var value : boolean = prop.floatValue != 0.0f; 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; } } }
no example available in C#
no example available in Boo
ビルトインの 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
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
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 // ...
PowerSlider により Range シェーダ プロパティに対する線形でない反応曲線のスライダーを表示します。
// A slider with 3.0 response curve [PowerSlider(3.0)] _Shininess ("Shininess", Range (0.01, 1)) = 0.08
パフォーマンス理由により、 EditorGUILayout 関数は MaterialPropertyDrawer と共に使用できません。 See Also: MaterialProperty クラス
Apply | マテリアルに追加の初期値を適用します |
GetPropertyHeight | GUI の高さを指定するにはこのメソッドのプロパティをピクセル単位でオーバーライドします |
OnGUI | このメソッドをオーバーライドしてプロパティに自身の GUI を作成します |