PropertyFieldというメソッドを使うと、渡した変数の型に合わせたフィールドを描画してくれます。
例えば、string型のフィールド名を指定してやると、
EditorGUILayout.PropertyField(serializedObject.FindProperty("name"), new GUIContent("name"));
こういう描画に。
Bounds型だと、
EditorGUILayout.PropertyField(serializedObject.FindProperty("boundsValue"), new GUIContent("boundsValue"));
こう。
フィールドの指定の仕方が、serializeObject.FindPropertyで取得してくるという方法でやることになります。
serializeObjectはエディトしているオブジェクトを指しています。
まあ、カスタムエディタでは、便利っぽいけど普通に代入して書いた方がわかりやすいわーって感じあるかもしれないですね。
クラスのフィールドが複数あって、とりあえずデフォルトの入力でいいからforとかで回して描画するときとかに便利かもしれません。
あとそうだ、privateなフィールドをCustormEditorで操作するときにはこれが使える。こっちが主な使い方かも。
その場合は、フィールドのほうにもSerializeField属性をつけないといけない。
[SerializeField] private string privateValue;
フィールドの定義をこうして、
EditorGUILayout.PropertyField(serializedObject.FindProperty("privateValue"), new GUIContent("private"));
こうすると、
こう。
このテキストボックスの値を変更すると、privateなフィールドに反映されます。
serializeObjectの注意点
serializeObjectを扱う上での注意点として、まず変更前にUpdate()を呼ぶこと。
これで、現在の最新の値を取得してきます。
エディター上ではインスペクタとカスタムウィンドウ上など、同じオブジェクトを触っている場合があるので、最新に保つようにしないといけないです。
変更した後はApplyModifiedProperties()を呼ぶこと。これで変更が確定します。逆にいうと、呼ばないと変更は反映されません。
SetDirtyをターゲットのオブジェクト(例でいうobj)に指定しても反映されないので、途中から追加する場合には注意が必要です。