リンドくん先生、Unityでゲームを作っているんですけど、敵と味方の弾が当たらないようにしたいんです。どうすればいいですか?
たなべそれにはUnityのLayer(レイヤー)とTag(タグ)という機能を使うといいよ。
これを使えば、どのオブジェクト同士が衝突するかを簡単にコントロールできるんだ。
リンドくんレイヤーとタグ...なんだか難しそうですね。
たなべ大丈夫!実はとてもシンプルな仕組みなんだよ。
今日はLayerとTagの基本的な使い方から、衝突制御の設定方法まで、順番に解説していくね。
Unityでゲームを開発していると、「特定のオブジェクト同士だけ衝突させたい」「敵だけを検出したい」といった場面に必ず出会います。
こうした制御を行わないと、味方の弾が味方に当たってしまったり、プレイヤーが通れない場所を敵がすり抜けてしまったりと、ゲームとして成立しなくなってしまいます。
そこで活躍するのがLayer(レイヤー)とTag(タグ)という2つの機能です。
どちらもUnityに標準で搭載されている機能で、適切に使い分けることで、衝突判定の制御やオブジェクトの効率的な管理が可能になります。
この記事では、LayerとTagそれぞれの役割と使い方、そして実践的なサンプルコードを交えながら、初心者の方にもわかりやすく解説していきます。
LayerとTagの違いを理解しよう
まず最初に押さえておきたいのが、LayerとTagの違いです。
どちらも「オブジェクトを分類する」という点では似ていますが、目的と使い方が異なります。
Layer(レイヤー)とは
Layerは主に物理演算やレンダリングの制御に使用します。
最も重要な用途は、衝突判定のオン・オフを切り替えることです。
例えば、以下のような場面で活躍します。
- プレイヤーの弾と敵の弾を衝突させない
- 特定のレイヤーだけにRaycast(光線)を当てる
- カメラで特定のオブジェクトだけを映す
Layerは最大32個まで作成でき、Unity全体のPhysics設定と連携して動作します。
Tag(タグ)とは
Tagは主にスクリプトからオブジェクトを識別するために使用します。
衝突判定そのものには直接関与せず、「このオブジェクトは何か」を判別するためのラベルのような役割を果たします。
例えば、以下のような場面で活躍します。
- 衝突したオブジェクトが「敵」かどうかを判定する
- 「アイテム」タグが付いたオブジェクトだけを収集する
- 「Player」タグのオブジェクトを検索して取得する
使い分けのポイント
簡単にまとめると、以下のように使い分けるとよいでしょう。
- 衝突するかどうかを制御したい → Layerを使う
- 衝突した後に相手が何かを判定したい → Tagを使う
この2つを組み合わせることで、複雑なゲームロジックもスマートに実装できます。
Layerの設定方法と衝突制御
リンドくんレイヤーって、どうやって設定するんですか?
たなべUnityのエディタから簡単に設定できるよ。
まずは新しいレイヤーを作成して、それをオブジェクトに割り当てるという流れになるんだ。
新しいLayerを作成する
- Unityエディタの上部メニューから Edit > Project Settingsを選択
- 左側のリストから Tags and Layersをクリック
- Layersセクションを展開
- 空いているUser Layerに名前を入力

オブジェクトにLayerを割り当てる
- Hierarchyウィンドウでオブジェクトを選択
- Inspectorウィンドウの上部にある Layerドロップダウンをクリック
- 作成したレイヤーを選択

Layer同士の衝突を制御する
ここが最も重要な部分です。
作成したLayer同士が衝突するかどうかは、Physics設定のCollision Matrix(衝突マトリクス)で制御します。
- Edit > Project Settings > Physics > Settings(3Dの場合)または Physics 2D(2Dの場合)を開く
- 画面下部に表示される Layer Collision Matrix を確認
- 衝突させたくないLayer同士のチェックを外す

この設定はプロジェクト全体に適用されるため、一度設定すれば個々のオブジェクトで何かする必要はありません。
Tagの設定方法とスクリプトでの活用
リンドくんタグの方はどうやって使うんですか?
たなべタグも同じように作成して割り当てるんだけど、スクリプトから判定に使うという点が大きな違いだね。
実際のコードを見てみよう。
新しいTagを作成する
- Edit > Project Settings > Tag and Layerを開く
- Tagセクションの
+ボタンをクリック - タグ名を入力(例: 「Enemy」「Item」「Coin」など)

オブジェクトにTagを割り当てる
- Hierarchyウィンドウでオブジェクトを選択
- Inspectorウィンドウの上部にある Tagドロップダウンをクリック
- 作成したタグを選択
Layerと違い、Tagは1つのオブジェクトに1つだけしか割り当てられません。

スクリプトでTagを判定する
Tagの真価は、スクリプトで相手のオブジェクトを識別するときに発揮されます。
以下は、衝突した相手が「Enemy」タグを持っているかどうかを判定するサンプルコードです。
using UnityEngine;
public class PlayerBullet : MonoBehaviour
{
public int damage = 10;
private void OnTriggerEnter(Collider other)
{
// 衝突した相手のTagを確認
if (other.CompareTag("Enemy"))
{
// 敵にダメージを与える処理
Enemy enemy = other.GetComponent<Enemy>();
if (enemy != null)
{
enemy.TakeDamage(damage);
}
// 弾を消滅させる
Destroy(gameObject);
}
}
}CompareTag()メソッドを使うことで、効率的にタグを比較できます。
other.tag == "Enemy"という書き方もできますが、CompareTag()の方がパフォーマンスが良いため、こちらを使うことをおすすめします。
特定のTagを持つオブジェクトを検索する
タグを使えば、シーン内の特定のオブジェクトを簡単に見つけることもできます。
// "Player"タグを持つオブジェクトを1つ取得
GameObject player = GameObject.FindWithTag("Player");
// "Enemy"タグを持つすべてのオブジェクトを取得
GameObject[] enemies = GameObject.FindGameObjectsWithTag("Enemy");ただし、Find系のメソッドは処理が重いため、頻繁に呼び出すのは避けましょう。
Start()やAwake()で一度だけ取得して、変数に保持しておくのがベストプラクティスです。
まとめ
リンドくんなるほど!レイヤーは「当たるかどうか」、タグは「何に当たったか」を判断するんですね。
たなべその通り!この2つをうまく使い分けることで、ゲームの制御がとても楽になるよ。
最初は混乱するかもしれないけど、実際に手を動かして試してみると、すぐに理解できるはずだよ。
リンドくん早速、自分のプロジェクトで試してみます!
たなべいいね!最後に今日のポイントをまとめておくから、復習に使ってね。
この記事では、UnityのLayerとTagについて解説してきました。
最後に重要なポイントを整理しておきましょう。
LayerとTagの役割
- Layer → 物理演算の制御(衝突させるかどうか)
- Tag → スクリプトでの識別(何に当たったか)
設定の流れ
- Tag and Layerで新しいLayerやTagを作成
- オブジェクトのInspectorから割り当て
- Physics設定のCollision Matrixで衝突の有無を設定
- スクリプトで
CompareTag()を使って判定
ベストプラクティス
- タグの比較には
CompareTag()を使う Find系メソッドは初期化時のみ使用する- Collision Matrixは最初にしっかり設計してから設定する
LayerとTagは、Unityでゲームを作る上で絶対に避けて通れない基礎知識です。
最初は少し複雑に感じるかもしれませんが、一度理解してしまえば、様々な場面で応用できる強力なツールになります。
ぜひ実際のプロジェクトで試してみて、衝突制御やオブジェクト管理の効率化を体感してみてください。





