読者です 読者をやめる 読者になる 読者になる

テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】エディタ拡張が「private」なメンバにアクセスする、多分一番楽な方法

Unity アセット紹介、AssetStore エディタ拡張・エディタ機能 ScriptableObject スクリプト

qiita.com

エディタ拡張が「private」なメンバにアクセスする、多分一番楽な方法についてです。この方法はEditor外にも処理を書かなければいけないので良くないですが、サクっと組みたい時は楽です。

ネストクラス経由でアクセス

単純な話、Privateなクラスにアクセス出来るのは以下の3つです。

  • 同じクラスがアクセス
  • ネストクラスがアクセス
  • Reflection経由でアクセス
  • SerializeObject経由でアクセス

ネストクラスとは、クラスの中に定義したクラスです。ネストクラスは親クラスのPrivateなメンバに自由にアクセス出来る特性があります。

class Hoge{
    class NestedClass{  }
}

つまりネストクラスでエディタ拡張を実装すれば、別にSerializeObjectとか使わなくても該当のクラスにアクセスが可能な訳です。

サンプルコード

幾つかのサンプルコードです。

f:id:tsubaki_t1:20150821020820p:plain

gist.github.com

上記のコードは「Init」ボタンを押した際に「private string label」の値に現在時刻を設定するといった無意味なコードです。
#if UNITY_EDITOR ~ #endif を使用してエディターコードをプロジェクトに含まれないように設定し、あとは通常のエディタ拡張と同様です。

ネストクラスを使用しているので、privateなメンバでもそのままアクセスが可能です。

 

f:id:tsubaki_t1:20150821021210p:plain

gist.github.com

このコードは「Action」ボタンを押すと「Lighttype」と同じ設定を持つライトを全選択するエディタ拡張です。
ScriptableObjectで本体がEditor以下にあるので、#if UNITY_EDITOR 等で囲まなくとも動作します。