Unity で、Tag とLayer をInspector から楽に入力できるように、PropertyDrawer をつくりました。

// 属性を付けると
[Tag] public string targetTag;
[Layer] public int targetLayer;
Inspector がこんなかんじに
Inspector がこんなかんじに
  1. Tag を手打ちしたくない
  2. NameCreator を使ってみる
  3. Inspector でも入力したい
  4. Editor からTag とLayer が取得できた

Tag を手打ちしたくない

void OnTriggerEnter (Collider other)
{
  if (other.tag == "Player")
    Debug.Log ("Hit!");
}

↑Tag の判定を単純に書くとこんな感じ
"Player" は文字列なので、タイプミスしてても動かないだけでエラーは出ないし、打つときに補完も出ない・・・

NameCreator を使ってみる

void OnTriggerEnter (Collider other)
{
  // Tagだったら、「TagName」というクラスを自動生成してくれるので、
  // コードからタイプセーフに扱えるようになる。便利。
  if (other.tag == TagName.Player)
    Debug.Log ("Hit!");
}

Unityがもっている文字列情報から、静的クラスを自動生成してくれるというNameCreator というのを試してみました。
これでタイプミスもしないし、補完も出るしいい感じ。

anchan828/namecreator

Inspector でも入力したい

// [Name(typeof(クラス名))]という属性を付けると、Inspector上でPopupで選べるように!
[Name(typeof(TagName))] public string playerTag;

void OnTriggerEnter (Collider other)
{
  if (other.tag == playerTag)
    Debug.Log("Hit!");
}

いまさらですが、Inspector で値を入力するのがすきです。(タイプミスが、補完が、とか言ってたのに・・・)
Editorから静的クラスのプロパティが取得できたので、NameCreator用のPropertyDrawerを自作してみたりしました。

Editor からTag とLayer が取得できた

ところが、こんなものEditorGUI.TagField を発見・・・
あれ?Editor のクラスに、Tag を表示する関数あったの?
静的クラスつくらなくても、表示できるの?


というわけでPropertyDrawerをつくりなおしました。

ついでに、EditorGUI.LayerField というのもあったので入れました。
下記のように値に属性をつけるだけで、Inspector で楽に入力できるようになります。

[Tag] public string targetTag;
[Layer] public int targetLayer;

void OnTriggerEnter (Collider other)
{
  if (other.tag == targetTag)
  {
    Debug.Log("Hit!");
    // 別レイヤーに移動するとか
    other.gameObject.layer = targetLayer;
  }
}
Tag が選べる :)
Tag が選べる :)
Layer が選べる :)
Layer が選べる :)

静的クラス生成方式は結構大掛かりなので、TagとLayerのみでいい、Inspectorで入力するからコード補完もいらない、という場合はこれだけでいいのかも。

uranuno/UnityUtils #TagAndLayerAttribute