この度やりたいことは、Inspector上で何かしらの値を変更した時に、GameObjectがそれに伴い反応をさせることです。 色を変更すれば、すぐに色が変わる。デフォルトで用意されているUIパーツでは実現ができているのですが、これを独自に実装をします。
Inspectorの変更を検知する
まずは、Inspector上の変更を検知します。 いろいろ調べた所、エディタ拡張をすれば実現ができそうでした。
エディタ拡張
OnInspectorGui()で、DrawDefaultInspector()を使えば判定ができます。 [c] public override void OnInspectorGUI() { base.OnInspectorGUI();
if (DrawDefaultInspector()) { // ここで更新処理を入れる } } [/c]
OnInspectorGUI
OnInspectorGUIはEditorクラスを継承して利用します。 OnInspectorGUIをInspectorをカスタマイズすることができます。 [c] public class CustomUIEditor : Editor { public override void OnInspectorGUI() {
} }
[/c] [エディタ拡張]についてはこちら。 第9章 CustomEditor
DrawDefaultInspector
DrawDefaultInspectorはカスタムInspectorにデフォルトのInspectorを表示させます。 コードを追っていくとデフォルトのInspector内で値の変更があればtrueを返してくれます。 [c] return EditorGUI.EndChangeCheck() [/c] EditorGUI.EndChangeCheck
更新処理
先程のエディタ拡張内に更新処理を実装します。
[c] [CustomEditor(typeof(ChangeUI),true)] [CanEditMultipleObjects] public class CustomUIEditor : Editor {
} [/c]
まずは、CustomEditorで「エディタ拡張を使うクラス」と CanEditMultipleObjects「複数のオブジェクトを編集」できるようにします。
呼び出し先のクラス
エディタ拡張で使用するクラスを準備します。 [c] public abstract class ChangeUI : UIBehaviour {
if UNITY_EDITOR
public abstract void OnInspectorChanged();
endif
} [/c]
上記クラスを継承したクラスを使います。 Inspector上のhogeの値を変更した場合に特定の処理を呼び出せます。
[c] public class MyChangeUI : ChangeUI { [SerializeField] private int hoge;
if UNITY_EDITOR
public override void OnInspectorChanged()
{
if (this == null)
{
return;
}
Debug.Log("hogeが更新されました");
}
endif
} [/c]