【Unity】【エディタ拡張】SerializedObjectのもつ全てのプロパティを描画する

エディタ拡張ではプロパティをEditorGUILayout.PropertyField()などを使って描画します。
ただしこの方法だとすべてのプロパティを描画したいときに一個一個書いていく必要があります。

この記事ではすべてのプロパティを一気に描画する方法を紹介します。

Unity2018.3.1

すべてのプロパティを描画する

全てのプロパティを描画するにはSerializedObjectのイテレータを取得してループさせます。

// SetializedObjectのイテレータを取得
var iter = serializedObject.GetIterator();
// 最初の一個はスクリプトへの参照なのでスキップ
iter.NextVisible(true);
// 残りのプロパティをすべて描画する
while(iter.NextVisible(false))
{
    // 描画しないプロパティはこんな感じで飛ばしておく
    if (iter.name == "_property1") {
        continue;
    }
    // 描画
    EditorGUILayout.PropertyField(iter, true);
}

上記はEditorGUILayoutの例ですが、EditorGUIでもやることは同じです。

配列型のプロパティの子をすべて描画

配列型のSerializedPropertyの子要素のSerializedProeprtyもループで取り出すことができます。
この場合は下記のようにdepthをうまく使うことがコツです。

var listProperty = serializedObject.FindProperty("_array");
// プロパティ名を描画
EditorGUILayout.PropertyField(listProperty, false);
if (listProperty.isExpanded) {
    var depth = -1;
    while(listProperty.NextVisible(true) || depth == -1){
        if (depth != -1 && listProperty.depth != depth) {
            // depthが変わったらリスト外のプロパティなのでbreak
            break;
        }
        depth = listProperty.depth;
        EditorGUILayout.PropertyField(listProperty, true);
    }
}