Tag とLayer を楽に入力するPropertyDrawer
Unity で、Tag とLayer をInspector から楽に入力できるように、PropertyDrawer をつくりました。
// 属性を付けると
[Tag] public string targetTag;
[Layer] public int targetLayer;
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 というのを試してみました。
これでタイプミスもしないし、補完も出るしいい感じ。
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とLayerのみでいい、Inspectorで入力するからコード補完もいらない、という場合はこれだけでいいのかも。