いんでぃーづ

ゲームいろいろ、いろいろ自由

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

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

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

拡張ってどうやるの

Unityで覚えておきたい拡張方法が二つあります。
ひとつはEditorウインドウ自体を新しく定義する方法。
もう一つは、既存のインスペクタの表示方法を変える方法。

二つ目の方法が、今回紹介するProperty Drawerで、インスペクタの一部だけ書き換えたい場合などに便利です。

ウインドウ自体を作っちゃうよりは簡単だろうと感じるかもしれませんが、
実はこっちのほうが敷居高いです。

自分でもしょっちゅう詰まるので、実は今回は自分の備忘録だったりします。

PropertyDrawerを使う

インスペクター上で独自GUIを描画するには、MonoBehaviour派生クラスのメンバ変数に Attributeをつけます。

下のような書き方を見たことあると思いますが、

    [MyValue(110)]
    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)ものすごくクセが強いんです。

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

indie-du.com


“Unity” and Unity logos are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere, and are used under license.


免責事項

当サイトの広告バナー、リンクによって提供される情報、サービス内容について、当サイトは一切の責任を負いません。

また、当サイトの情報を元にユーザ様が不利益を被った場合にも、当サイトは一切の責任を負いません。

すべて自己責任でお願いします。