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

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

 Inspectorに表示されるようなMaterialのShaderプロパティをEditorWindowで表示するScriptを作成しました。基本的なAttributeにも対応しています。

※コントロールの作成部分は次の記事、「MaterialのShaderプロパティーを表示 その2(Editor拡張)」に記述しています。

Script

 作成したScriptは以下の通りです。

プロパティの表示に必要なデータの取得

 material(target_mat)からshaderを読み込み、ShaderUtil.GetPropertyCountでshaderのプロパティ数を取得します。

boxを作成し、そこへmaterialの名前とshaderの名前を表示します。

プロパティの型(prop_type)、名前(prop_name)及び表示用の名前(description)を取得します。shaderにはprop_name (description, prop_type) = …のように記述されています。さらにprop_nameからプロパティのインデックスを取得します(index)。

Attributeの取得と前処理

 Attributeを取得し、それに応じてコントロールを変更します。HideInInspector、Space及びHeaderに関してはプロパティのコントロールを表示する前に処理を行う必要があります。また、Attributeはその種類に応じて()内に追加で記述が行われています。そのためAttributeの種類と追加の記述部分を分けます。これらをコントロールの表示を行う前に処理を行います。

Attributeの取得

 GetPropertyAttributesによりshaderの指定したインデックスにおけるプロパティのAttributeを全て取得します。

HideInInspector

 HideInInspectorはプロパティを非表示にするAttributeです。HideInInspectorはshader.GetPropertyFlagsで取得できます。これを用いてHideInInspectorが指定されていた場合はcontinueによって処理を飛ばすことでプロパティが非表示となるように処理を行っています。

Space

 Spaceのみ記述されている場合はEditorGUILayout.Spaceを実行し、Space(数値)の場合は数値に応じてSpaceの高さを変更しています。数値の取得にはRegex.Matchesにより正規表現を用いて()内の数値を取り出しています。取得した数値部分はstring型なのでint.Parseによってint型へ変換しています。この際、int型へ変換できなかった場合は数値を指定せずにEditorGUILayout.Spaceを実行するようにしています。

Header

 Headerの処理です。先ほどと同様に正規表現を用いて()内を取得し、これを用いてHeaderの追加を行っています。

その他のAttribute

 コントロールの表示に関わるAttributeについては、予めAttributeの種類と()内の記述部分に分けます。例えば、PowerSlider(0.5)が指定されていた場合、PowerSlider(attribs)と0.5(param)へ分けます。また、Attributeは後ろに記述されているものが優先されるようなので、attribsとparamの順番を逆順にしています。

※コントロールの作成部分は次の記事、「MaterialのShaderプロパティーを表示 その2(Editor拡張)」に記述しています。