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