【Unity】Inspectorの変更を検知する

この度やりたいことは、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]