MaterialのShaderプロパティーを表示 その2(Editor拡張)

MaterialのShaderプロパティーを表示 その2(Editor拡張)

コントロールの作成

 プロパティの表示に必要なデータの取得で取得したプロパティのタイプ(prop_type)を用いて、プロパティのタイプによって作成するコントロールを変更します。

Colorプロパティ

 colorプロパティに作用するAttributeはありません。そのため、以下に示すように色を選択するコントロールの作成のみを行っています。

Vectorプロパティ

 Vectorプロパティもcolorプロパティと同様にAttributeはありません。そのため、Vectorを選択するコントロールの作成のみを行っています。

Floatプロパティ

 Floatプロパティに有効なAttributeはToggle、Enum及びKeywordEnumがあります。これらが指定されて場合、Attributeによってコントロールの表示方法などを変更します。

Toggle

 AttributeにToggleもしくはMaterialToggleが指定されていた場合、FloatプロパティはToggleで表示されます。

GetFloatによりプロパティの数値を取得します。取得した数値をbool型へ変換します。(0→false、0以外→true)このbool値を用いてToggleを作成します。Toggleの結果はそのままshaderへ渡すことができないので、bool値に応じた数値(true→1、false→0)へ変換します。

Attributeが[Toggle]または[MaterialToggle]であった場合、プロパティ名_ONのようなキーワードを用いてバリアントを作成できます。よって、Toggleから取得したbool値を用いてキーワードの状態を変更します。また、キーワードは全て大文字にしなければならないのでstring.ToUpperによってプロパティ名を大文字へ変更しています。

Attributeが[Toggle(param)]であった場合、バリアントのキーワードにparamを使用することができます。よって、以下のようにparamでキーワードの状態を変更しています。最後に、control_created=trueとすることでコントロールが作成されたことを知らせます。

Enum

 FloatプロパティのAttributeにEnumを指定することができます。Enumはキーワードを指定すると、そのキーワードに指定されている数値を設定することができます。

EnumのAttributeは[Enum(ZERO, 0, HALF, 0.5, ONE, 1)]のように記述されています。よって取得したparam(ZERO, 0, HALF, 0.5, ONE, 1)をキーワードと数値へ分ける必要があります。始めに、空白の削除を行い、カンマによって文字列を分割します。次に、取得したparamが妥当か検討します。名前と数値が組となっている場合は、分割された文字列(enum_temp)の数は偶数となるはずです。よって、偶数でなかった場合は正しくAttributeが記述できていません。この場合は、breakにより処理を抜け、通常のFloatプロパティを表示します。

次に、分割した文字列をキーワードと数値へ分けます。数値部分はstring型で取得しているのでfloat.Parseを用いてfloat型へ変換します。float型へ変更できなかった場合はerror=trueとすることで処理を抜け、次のAttributeの処理を行います。また、選択されているキーワードの順番をselectedで受け取ります。

これらのキーワードと数値を用いてEnum用のコントロールを作成ます。また、選択されたキーワードの数値をvalへ代入し、後にマテリアルへ渡します。最後に、control_created=trueとすることでコントロールが作成されたことを知らせます。

KeywordEnum

 AttributeにKeywordEnumを指定することでUIから有効なバリアントのキーワードを変更することができます。

Enumの場合と同様に、空白を削除した後にカンマによってparamを分割します。

プロパティより得られる数値は、選択されているキーワードの番号となります。[KeywordEnum(Red, Green, Blue)]の場合は、Redは0、Greenは1、Blueは2となります。よって、取得した文字列と数値を用いてKeywordEnum用のコントロールを作成します。

選択された番号をマテリアルへ渡し、選択されたキーワードを有効にします。この際、選択されなかったキーワードは無効にする必要があります。最後に、control_created=trueとすることでコントロールが作成されたことを知らせます。

Float

 Attributeが無効もしくは指定されていない場合は、通常のFloatプロパティを作成します。最後に、material.SetFloatにより変更された数値をマテリアルへ渡します。

Rangeプロパティ

 RangeプロパティはPowerSliderとIntRangeをAttributeへ指定できます。これらが指定された場合、Attributeによってコントロールの表示方法などを変更します。

PowerSlider

 RangeプロパティのAttributeにはPowerSliderを指定することができます。Shaderには[PowerSlider(数値)]と記述されます。paramには括弧内の数値がstring型で入っています。よって、これをfloat.Parseを用いてfloat型へ変換します。もし、変換できなかった場合は処理を飛ばし、次のAttributeの処理を行います。変換できた場合はPowerSliderを作成し、最後に、control_created=trueとすることでコントロールが作成されたことを知らせます。

IntRnage

 AttributeにIntRangeが指定されていた場合、IntSliderを作成します。今までと同様に、control_created=trueとすることでコントロールが作成されたことを知らせます。

Textureプロパティ

 TextureプロパティにはNoScaleOffsetを指定することができます。このAttributeを指定すると、TextureプロパティのScaleとOffsetを非表示にすることができます。NoScaleOffsetはshader.GetPropertyFlagsより取得することができます。この結果より、ScaleとOffsetのありなしの処理を分けています。

NoScaleOffset

 AttributeにNoScaleOffsetがあるTextureプロパティの処理です。TextureにはTexture、Cube、Texture3D及びTexture2DArrayがあります。よって、Textureの種類ごとにScale及びOffsetを表示しないTexture用のコントロールを作成しています。

NoScaleOffsetがない場合

 TextureプロパティにNoScaleOffsetがない場合の処理です。Scale及びOffsetを表示するTexture用コントロールを作成します。

実行結果

 作成したMaterialのShaderプロパティを表示するコードは以下のScriptで実行できます。以下のScriptではLightSkinが適用されます。DarkSkinはコンメントアウト部分に記述しています。

以上のScriptの動作を確認するために以下のShaderを作成しました。

実行結果は以下の通りです。各コントロールの作成が問題なく行われていることが分かります。また、Toggleによるキーワードの状態の変更、Enumによる数値変更やKeywordEnumによるキーワードの変更が行えていることが分かります。