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

いんでぃーづ

個人でゲーム開発してる上で吸収したモノたち紹介。UnityからGIMPまでなんでも。デザインとかゲーム論まで語っちゃうよ的なアレ。

MENU
{スポンサーリンク}

Unity : インスペクタで独自UIを使う - PropertyDrawer の下準備

Unity

エディター拡張してますか? 最近思うんですよ。エディタ拡張を自分で書くのは大事だなって。

拡張とか敷居高いなあと思ってたんですが、ゲーム開発って自作ツールが結構重要だとひしひし感じています。

拡張ってどうやるの

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属性を指定する必要がありますので注意。


ここまででコンパイルエラーが出なければ、いよいよ独自ビューの描画にとりかかることができます。
そしてここからが本番でございます。

実はPropertyDrawerのOnGUI関数は、他と比べて(MonoBehaviourやEditor)ものすごくクセが強いんです。

なので次の記事をまるまる割いていきたいと思います!

indie-du.com

Amazon.co.jpアソシエイト