[Unity] インスペクタから編集可能なprivateフィールドにアクセスする

Unityではシリアライズ可能なフィールドは以下のようにインスペクタから編集することが出来ます。

private-editor-access1

MonoBehaviourを継承したクラスには[Serializable]属性が指定されているため、シリアライズすることが出来ます。
シリアライズ可能なクラスでは、publicまたは[SerializeField]属性が指定されたフィールドがインスペクタ上に表示され、編集可能になります。
すなわち、[SerializeField]属性が指定されていればprivateなフィールドでも編集可能になります。

では、エディタ拡張などで[SerializeField]属性が指定されたprivateフィールドにアクセスする場合はどうすればよいでしょうか?
例えば、以下のようなEnemyクラスを実装したとします。

ここでエディタ拡張するために以下のようなEnemyEditorクラスを定義します。

しかし、Enemyクラスのフィールドは皆privateであるため、外側からアクセスできません。
したがって、上記のEnemyEditorクラスはコンパイルエラーとなります。
フィールドをpublicにすればアクセス可能になりますが、エディタ拡張のためにわざわざフィールドを公開してしまうのは好ましくありません。

このようにシリアライズされたフィールドにアクセスするためには、SerializedObjectを用います。
具体的な使い方は以下の通りです。

これでEnemyEditorクラスからEnemyクラスのフィールドにアクセスすることが出来ます。
インスペクタを表示してみると以下のようにEnemyEditorによってスライダーにより値が編集できるようになっていることを確認できます。

private-editor-access2

エディタ拡張でシリアライズ可能なフィールドにアクセスする場合は、基本的にSerializedObjectを通じてアクセスする習慣をつけておけば問題無いかと思います。