エディター拡張してますか? 最近思うんですよ。エディタ拡張を自分で書くのは大事だなって。
拡張とか敷居高いなあと思ってたんですが、ゲーム開発って自作ツールが結構重要だとひしひし感じています。
拡張ってどうやるの
Unityで覚えておきたい拡張方法が二つあります。
ひとつはEditorウインドウ自体を新しく定義する方法。
もう一つは、既存のインスペクタの表示方法を変える方法。
二つ目の方法が、今回紹介するProperty Drawerで、インスペクタの一部だけ書き換えたい場合などに便利です。
ウインドウ自体を作っちゃうよりは簡単だろうと感じるかもしれませんが、
実はこっちのほうが敷居高いです。
自分でもしょっちゅう詰まるので、実は今回は自分の備忘録だったりします。
PropertyDrawerを使う
インスペクター上で独自GUIを描画するには、MonoBehaviour派生クラスのメンバ変数に Attributeをつけます。
下のような書き方を見たことあると思いますが、
[MyValue(1, 10)] public float TestValue;
[ ]で囲まれているのがAttributeです。まずこれを自作する必要があります。
Attributeを定義する
PropertyAttributeクラスを継承したスクリプトを作成します。
using UnityEngine; using UnityEditor; using System.Collections; public class MyValueAttribute : PropertyAttribute { }
この時気をつけたいのですが、このスクリプトは通常のスクリプトのディレクトリに置きましょう。
Eitorディレクトリに置くとコンパイルエラーになります。
一旦Attributeの作成はこれで置いておきます。
Property Drawer を定義する
インスペクターへの描画を担当するのがPropertyDrawerです。
PropertyDrawerを継承したクラスを作成します。
そしてOnGUI関数をオーバーライドします。
using UnityEngine; using UnityEditor; using System.Collections; [CustomPropertyDrawer(typeof(MyValueAttribute))] // ① public class MyValueDrawer : PropertyDrawer { public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { } }
コード中の ①の部分には、さきほど作成したAttributeクラスの名前を指定します。
また、MonoBehaviourクラスと違い、OnGUIにはoverride属性を指定する必要がありますので注意。
こちらのスクリプトは UnityEditorネームスペースを使っているため、 Editor ディレクトリに置くのがいいんじゃないかなあ。
シリアライズ保存したい変数にAttributeを適用する
public変数をコンポーネントに定義し、自作したAttributeをつけましょう。
public class TestClass : MonoBehaviour { [MyValue] public float TestValue;
もしくは SerializeField 属性を同時につけます。
public class TestClass : MonoBehaviour { [SerializeField, MyValue] float TestValue;
でないとインスペクタに表示されないので注意。
ここまででコンパイルエラーが出なければ、いよいよ独自ビューの描画にとりかかることができます。
そしてここからが本番でございます。
実はPropertyDrawerのOnGUI関数は、他と比べて(MonoBehaviourやEditor)ものすごくクセが強いんです。
なので次の記事をまるまる割いていきたいと思います!