ShaderGraphのCustomGUIEditorでデフォルト表示がしたい
通常のシェーダーではShaderGUIを継承したクラスを作成すればInspectorがまっさらな状態になって色々カスタマイズができるがShaderGraphで作成したInspectorをカスタマイズする場合はBaseShaderGUIを継承すると
デフォルト表示であるSurfaceOptions、SurfaceInputs、AdvancedOptionsのトグル領域をそのまま使用することができる
【Unity】ShaderGraphで作成したシェーダーのInspectorを拡張する
ShaderGUIではOnGUIでbase.OnGUIを実行すればデフォルト表示をしてくれるがBaseShaderGUIではそれができないので調べたところDrawSurfaceInput内でBaseShaderGUI.DrawShaderGraphPropertiesを実行すれば良いのだがinternalのためアクセスできない
そこでリフレクションを使って解決した
デフォルト表示であるSurfaceOptions、SurfaceInputs、AdvancedOptionsのトグル領域をそのまま使用することができる
【Unity】ShaderGraphで作成したシェーダーのInspectorを拡張する
ShaderGUIではOnGUIでbase.OnGUIを実行すればデフォルト表示をしてくれるがBaseShaderGUIではそれができないので調べたところDrawSurfaceInput内でBaseShaderGUI.DrawShaderGraphPropertiesを実行すれば良いのだがinternalのためアクセスできない
そこでリフレクションを使って解決した
MethodInfo DrawShaderGraphPropertiesInfo;
public override void DrawSurfaceInputs(Material material)
{
if (DrawShaderGraphPropertiesInfo == null)
{
var assembly = typeof(BaseShaderGUI).Assembly;
var baseShaderGUI = assembly.GetType("UnityEditor.BaseShaderGUI");
DrawShaderGraphPropertiesInfo = baseShaderGUI.GetMethod("DrawShaderGraphProperties", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance);
}
else
{
DrawShaderGraphPropertiesInfo.Invoke(this, new object[] { material, properties });
}
}
エディタ内のことなので多少は問題ないと思うがリフレクション処理は重いのでキャッシュ化等は各自の判断で