【Unity】エディタ拡張が「private」なメンバにアクセスする、多分一番楽な方法
エディタ拡張が「private」なメンバにアクセスする、多分一番楽な方法についてです。この方法はEditor外にも処理を書かなければいけないので良くないですが、サクっと組みたい時は楽です。
ネストクラス経由でアクセス
単純な話、Privateなクラスにアクセス出来るのは以下の3つです。
- 同じクラスがアクセス
- ネストクラスがアクセス
- Reflection経由でアクセス
- SerializeObject経由でアクセス
ネストクラスとは、クラスの中に定義したクラスです。ネストクラスは親クラスのPrivateなメンバに自由にアクセス出来る特性があります。
class Hoge{
class NestedClass{ }
}
つまりネストクラスでエディタ拡張を実装すれば、別にSerializeObjectとか使わなくても該当のクラスにアクセスが可能な訳です。
サンプルコード
幾つかのサンプルコードです。
上記のコードは「Init」ボタンを押した際に「private string label」の値に現在時刻を設定するといった無意味なコードです。
#if UNITY_EDITOR ~ #endif を使用してエディターコードをプロジェクトに含まれないように設定し、あとは通常のエディタ拡張と同様です。
ネストクラスを使用しているので、privateなメンバでもそのままアクセスが可能です。
このコードは「Action」ボタンを押すと「Lighttype」と同じ設定を持つライトを全選択するエディタ拡張です。
ScriptableObjectで本体がEditor以下にあるので、#if UNITY_EDITOR 等で囲まなくとも動作します。