ゴマちゃんフロンティア

アザラシが大好きなエンジニアの開発日記です

【Unityメモ】エディタ拡張でタグを選択できるようにする

time 2016/10/19

というわけで、絶賛仕事が忙しいりべるんです。
ブログのネタはおろか、Unity すらまともに触れていない日々です。
すっぽかすわけにもいかないので、何か簡単に記事にできそうなものについて書いていきます。

shot2ss20161019200247596

今回のお題はタイトル通り、「エディタ拡張でタグマネージャのタグを選択できるようにする」ことです!
ぐぐるとそれなりにヒットするので今更感はありますが、自分用のメモとして書いておきます。

拡張用クラスの作成

エディタ拡張用のクラスを作成します。
Editor ディレクトリの中に保存する必要があります。

using UnityEngine;
using UnityEditor;
using System.Collections;

[CustomEditor(typeof(Block))]
public class TagSelecter : Editor {
    SerializedProperty trigger_tag;

    void OnEnable() {
        trigger_tag = serializedObject.FindProperty("trigger_tag");
    }

    public override void OnInspectorGUI() {
        base.OnInspectorGUI();

        serializedObject.Update();

        trigger_tag.stringValue = EditorGUILayout.TagField("Trigger Tag", trigger_tag.stringValue);

        serializedObject.ApplyModifiedProperties();
    }
}

Unity5.3から SerializedProperty を使用した形式でないと値が保存されないようです。
OnInspectorGUI() 内で Update() と ApplyModifiedProperties() を呼ぶようにします。

ちなみにエディタ拡張で指定した際、クラスのフィールドがインスペクターに表示されなくなってしまいますが、親の OnInspectorGUI() を呼んであげれば上手くいくようです。
割と盲点だったので気を付けるようにします。

拡張先のクラス修正

タグマネージャから選択させる理由として、「ブロックが特定のタグと接触した場合のみ壊れる」といったことをしたいためです。
インスペクターから直接打ち込んでも良いのですが、タグマネージャから選択できるほうが便利で確実です。

ゲーム上のブロックは Block クラスを継承しているため、Block クラスにエディタ拡張を設定します。
エディタ拡張クラスで [CustomEditor] 属性で Block を指定しておきます。

using UnityEngine;
using System.Collections;

public class Block : MonoBehaviour {

    [HideInInspector]
    public string trigger_tag;

    public void OnTriggerEnter(Collider c){
        if (c.gameObject.tag == trigger_tag) {
            Destroy(gameObject);
        }
    }
}

とりあえず最低限の動作ですが、こんな感じでしょうか。
フィールド名はエディタ拡張クラスの FindProperty() の引数と合わせる必要があります。

public の場合、フィールド自体の項目とエディタ拡張の項目で二重に表示されてしまいます。
他から変えてもらっても困るので private か protected が妥当なところですが、今の構造上変えるのも面倒だったので、[HideInInspector] 属性を付けてインスペクター上から隠してみました。

まとめ

すごく短いですが、エディタ拡張でタグを選択できるようにしてみました!
所謂「マジックストリング」的なコーディングは避けたいところなので、こういった便利機能を入れていきたいですね。

down

コメントする