こんにちは!今回はUnityのタグの使い方について解説します。
タグはとても便利な機能なので、ぜひこの機会にマスターしちゃいましょう!
タグとは?

タグとは、ゲームオブジェクトに割り当てることができるラベルのことです。
例えば敵キャラクターにenemyというタグをつけておくと、スクリプトから敵キャラクターだけを検索して取得することができます。
一つだけのオブジェクトを取得することもできますし、複数のオブジェクトを同時に取得し、処理を行うこともできとても便利です。
上の例では、色のついた箱それぞれに違うタグを設定しており、黒球が触れた箱のタグによって違う処理を行うようにしています。
タグを使うとこのような処理も簡単に行えるようになります!
タグの設定方法
オブジェクトをタグ付けする
タグを使うには、最初に新しくタグを作って名前をつけてあげる必要があります。
まずは、新しいゲームオブジェクトを作成します。ここではCubeを選択します。

次に、タグを設定したいゲームオブジェクトのInspectorを開きます。
デフォルトではタグが「Untagged」になっているかと思います。
「Untagged」をクリックしてAdd Tagを選択してください。
するとタグ設定画面が開きます。
Tagsの右下にある+ボタンを押して、「enemy」タグを追加してみましょう。

これで新たにenemyタグが追加されました。
タグはどんどん数が増えていくので、後からみても分かりやすい名前にしておくことがオススメです
しかしまだ新しいタグを作っただけでゲームオブジェクトには反映されていません。

再びゲームオブジェクトのInspectorを開き、Tagの項目を開くと「enemy」が追加されています。
enemyより上のタグはデフォルトで用意されているものです。
これを選択することで、このゲームオブジェクトを「enemy」とタグ付けすることができます。
タグをスクリプトから検索・取得する
タグはスクリプトから利用して初めて、便利に使うことができます。
まずはタグ付けされたゲームオブジェクトを検索し、取得するコードを紹介します。
GameObject enemy = GameObject.FindGameObjectWithTag("enemy")
このスクリプトでは、enemyというタグがついたゲームオブジェクトを一つ取得することができます。
また、同じタグが付いた複数のゲームオブジェクトを一度に取得したい場合はこちらのコードを使います。
GameObject[] enemys = GameObject.FindGameObjectsWithTag("enemy")
こちらは返り値が配列になっている点、GameObjectsと複数形になっている点が要注意です。
タグをスクリプトから変更したい時
ゲームオブジェクトにつけられたタグを、スクリプトから動的に変更することもできます。
ただし、変更したいタグ名はあらかじめ先ほどの「enemy」のように作成しておく必要があります。
例えば、触れると一度だけ取得できるアイテムを作りたい場合を考えます。
itemというタグが付いたオブジェクトを作成し、プレーヤーが触れるとitemを取得し、タグをboxに変更する仕様にしてみましょう。
//プレーヤーが何かに触れた時
void OnCollisionEnter(Collision other)
{
//触れた相手のタグがitemのとき
if(other.gameObject.tag == "item")
{
//タグをitemからboxに変更する
other.gameObject.tag = "box";
Debug.Log("アイテムを手に入れた");
}
}
このようにスクリプトからgameObject.tagを変更することで、タグを動的に変更することができます。
タグを削除したい時
タグは一度名前を決めたら変更することはできません。
変更したい場合はタグを削除して作り直す必要があります。
タグを削除するには、InspectorからTag→Add Tagをクリック
削除したいタグ名をクリックして右下の-ボタンを押せば削除できます。

タグで複数の当たり判定を管理できる
タグを使うと、何と衝突したかによって当たり判定を変えることが簡単にできます。
衝突判定の基本的なコードについては以下の記事が参考になります。

例えば、プレーヤーが敵にぶつかった時、アイテムに触れた時、ゴールに触れた時などで判定を分けたい場合を考えてみます。
まずそれぞれのオブジェクトにenemy,item,goal などのタグを設定し、以下のような衝突判定処理を実装します。
void OnCollisionEnter(Collision other)
{
//敵にぶつかったとき
if(other.gameObject.tag == "enemy")
{
Debug.Log("敵にぶつかった");
}
//アイテムをゲットした時
else if(other.gameObject.tag == "item")
{
Debug.Log("アイテムをゲットした");
}
//ゴールした時
else if(other.gameObject.tag == "goal")
{
Debug.Log("ゴールした");
}
}
このようにタグによって場合分けし、プレーヤーと衝突したオブジェクト(other)のタグが何かによって、その処理を変えることができます。
実際に利用する時は、Debug.Logをオブジェクトに適応させたい処理に変更して使いましょう。
タグとレイヤーの違いとは?
タグとレイヤーはゲームオブジェクトをグループ分けする機能という点では同じです。
ですが、それぞれ便利な使い方が異なります。
タグの特徴には、以下のようなものがあります。
- タグはスクリプト上から複数のオブジェクトをまとめて処理したい場合に便利。
- タグでオブジェクトを検索する方法は他のFind関数よりも処理が軽い。
- 個数制限がない。
対して、レイヤーの特徴には、以下のようなものがあります。
- カメラに特定のレイヤーのオブジェクトを写さないようにすることができる。
- 特定のレイヤーに所属するオブジェクト同士を衝突させないようにできる。
- Max32個まで。その上数個は編集することができないデフォルトレイヤーがある。
ここで紹介したレイヤーの基本や設定方法については、下記の記事で詳しく解説しています。

まとめ
- タグの設定手順
- 新しくタグを作り名前を付ける
- オブジェクトをタグ付けする
- タグをスクリプトから取得、操作する
- タグを使えば複数の当たり判定を管理できる
- タグはスクリプト上からオブジェクトを操作したい場合に便利
- レイヤーの方が向いている操作もある
以上、タグの設定方法と使用例の解説でした。
タグを使わずとも実現できる処理もありますが、タグを使った方がより簡潔に軽い処理で実現できます。
タグは作れる個数に上限がないので、使いそうなタグを予め作っておいてどんどん使っていきたいですね!
コメント