EditorWindowにMaterialEditorを用いてマテリアルプロパティを表示(Editor拡張)

EditorWindowにMaterialEditorを用いてマテリアルプロパティを表示(Editor拡張)

 作成したEditorWindowへMaterialEditorを用いてマテリアルのプロパティを表示する方法です。

MaterialEditorの作成とプロパティの表示

 マテリアルエディターはEditor.CreateEditorによって作成することができます。これを用いてマテリアルのヘッダーとプロパティの描画を行います。

private void OnGUI()
{
    EditorGUI.BeginChangeCheck();
    mat = (Material)EditorGUILayout.ObjectField("material", mat, typeof(Material), false);
    if (mat != null && EditorGUI.EndChangeCheck())
    {
        if (materialEditor != null) DestroyImmediate(materialEditor);
        materialEditor = (MaterialEditor)Editor.CreateEditor(mat, typeof(MaterialEditor));
    }

    if (materialEditor != null)
    {
        materialEditor.DrawHeader();
        materialEditor.OnInspectorGUI();
    }
}

これを実行すると以下のようになります。

ヘッダーをクリックし、プロパティを開くと以下のようにプロパティ以外は消えてしまいます。

解決方法

 DrawHeaderとOnInspectorGUIを垂直グループに追加することで正しく表示されるようになりました。

if (materialEditor != null)
{
    EditorGUILayout.BeginVertical();
    materialEditor.DrawHeader();
    materialEditor.OnInspectorGUI();
    EditorGUILayout.EndVertical();
}

スクロールの追加

 このままでは、プロパティを全て表示できないのでスクロールを追加します。

if (materialEditor != null)
{
    scroll = EditorGUILayout.BeginScrollView(scroll);
    EditorGUILayout.BeginVertical();
    materialEditor.DrawHeader();
    materialEditor.OnInspectorGUI();
    EditorGUILayout.EndVertical();
    EditorGUILayout.EndScrollView();
}

実行すると以下のようになります。特に問題なくスクロールが追加されました。

試しに、垂直グループを削除し、スクロールのみにしたところ

if (materialEditor != null)
{
    scroll = EditorGUILayout.BeginScrollView(scroll);
    materialEditor.DrawHeader();
    materialEditor.OnInspectorGUI();
    EditorGUILayout.EndScrollView();
}

となり、正しく表示できませんでした。