フリーキーズ | 独学プログラミング

Unity入門 LayerとTagで衝突制御と管理を簡単に!初心者でもわかる使い方ガイド

リンドくん

リンドくん

先生、Unityでゲームを作っているんですけど、敵と味方の弾が当たらないようにしたいんです。どうすればいいですか?

たなべ

たなべ

それにはUnityのLayer(レイヤー)Tag(タグ)という機能を使うといいよ。
これを使えば、どのオブジェクト同士が衝突するかを簡単にコントロールできるんだ。

リンドくん

リンドくん

レイヤーとタグ...なんだか難しそうですね。

たなべ

たなべ

大丈夫!実はとてもシンプルな仕組みなんだよ。
今日はLayerとTagの基本的な使い方から、衝突制御の設定方法まで、順番に解説していくね。

Unityでゲームを開発していると、「特定のオブジェクト同士だけ衝突させたい」「敵だけを検出したい」といった場面に必ず出会います。
こうした制御を行わないと、味方の弾が味方に当たってしまったり、プレイヤーが通れない場所を敵がすり抜けてしまったりと、ゲームとして成立しなくなってしまいます。

そこで活躍するのがLayer(レイヤー)Tag(タグ)という2つの機能です。
どちらもUnityに標準で搭載されている機能で、適切に使い分けることで、衝突判定の制御オブジェクトの効率的な管理が可能になります。

この記事では、LayerとTagそれぞれの役割と使い方、そして実践的なサンプルコードを交えながら、初心者の方にもわかりやすく解説していきます。

プログラミング学習でお悩みの方へ

HackATAは、エンジニアを目指す方のためのプログラミング学習コーチングサービスです。 経験豊富な現役エンジニアがあなたの学習をサポートします。

✓ 質問し放題

✓ β版公開中(2025年内の特別割引)

HackATAの詳細を見る

LayerとTagの違いを理解しよう

まず最初に押さえておきたいのが、LayerとTagの違いです。
どちらも「オブジェクトを分類する」という点では似ていますが、目的と使い方が異なります

Layer(レイヤー)とは

Layerは主に物理演算やレンダリングの制御に使用します。
最も重要な用途は、衝突判定のオン・オフを切り替えることです。

例えば、以下のような場面で活躍します。

  • プレイヤーの弾と敵の弾を衝突させない
  • 特定のレイヤーだけにRaycast(光線)を当てる
  • カメラで特定のオブジェクトだけを映す

Layerは最大32個まで作成でき、Unity全体のPhysics設定と連携して動作します。

Tag(タグ)とは

Tagは主にスクリプトからオブジェクトを識別するために使用します。
衝突判定そのものには直接関与せず、「このオブジェクトは何か」を判別するためのラベルのような役割を果たします。

例えば、以下のような場面で活躍します。

  • 衝突したオブジェクトが「敵」かどうかを判定する
  • 「アイテム」タグが付いたオブジェクトだけを収集する
  • 「Player」タグのオブジェクトを検索して取得する

使い分けのポイント

簡単にまとめると、以下のように使い分けるとよいでしょう。

  • 衝突するかどうかを制御したい → Layerを使う
  • 衝突した後に相手が何かを判定したい → Tagを使う

この2つを組み合わせることで、複雑なゲームロジックもスマートに実装できます。

Layerの設定方法と衝突制御

リンドくん

リンドくん

レイヤーって、どうやって設定するんですか?

たなべ

たなべ

Unityのエディタから簡単に設定できるよ。
まずは新しいレイヤーを作成して、それをオブジェクトに割り当てるという流れになるんだ。

新しいLayerを作成する

  1. Unityエディタの上部メニューから Edit > Project Settingsを選択
  2. 左側のリストから Tags and Layersをクリック
  3. Layersセクションを展開
  4. 空いているUser Layerに名前を入力
レイヤー設定画面

レイヤー設定画面

オブジェクトにLayerを割り当てる

  1. Hierarchyウィンドウでオブジェクトを選択
  2. Inspectorウィンドウの上部にある Layerドロップダウンをクリック
  3. 作成したレイヤーを選択
レイヤーをオブジェクトに設定

レイヤーをオブジェクトに設定

Layer同士の衝突を制御する

ここが最も重要な部分です。
作成したLayer同士が衝突するかどうかは、Physics設定のCollision Matrix(衝突マトリクス)で制御します。

  1. Edit > Project Settings > Physics > Settings(3Dの場合)または Physics 2D(2Dの場合)を開く
  2. 画面下部に表示される Layer Collision Matrix を確認
  3. 衝突させたくないLayer同士のチェックを外す
Collision Matrix設定画面

Collision Matrix設定画面

この設定はプロジェクト全体に適用されるため、一度設定すれば個々のオブジェクトで何かする必要はありません。

Tagの設定方法とスクリプトでの活用

リンドくん

リンドくん

タグの方はどうやって使うんですか?

たなべ

たなべ

タグも同じように作成して割り当てるんだけど、スクリプトから判定に使うという点が大きな違いだね。
実際のコードを見てみよう。

新しいTagを作成する

  1. Edit > Project Settings > Tag and Layerを開く
  2. Tagセクションの+ボタンをクリック
  3. タグ名を入力(例: 「Enemy」「Item」「Coin」など)
タグ設定画面

タグ設定画面

オブジェクトにTagを割り当てる

  1. Hierarchyウィンドウでオブジェクトを選択
  2. Inspectorウィンドウの上部にある Tagドロップダウンをクリック
  3. 作成したタグを選択

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 → スクリプトでの識別(何に当たったか)

設定の流れ

  1. Tag and Layerで新しいLayerやTagを作成
  2. オブジェクトのInspectorから割り当て
  3. Physics設定のCollision Matrixで衝突の有無を設定
  4. スクリプトでCompareTag()を使って判定

ベストプラクティス

  • タグの比較にはCompareTag()を使う
  • Find系メソッドは初期化時のみ使用する
  • Collision Matrixは最初にしっかり設計してから設定する

LayerとTagは、Unityでゲームを作る上で絶対に避けて通れない基礎知識です。
最初は少し複雑に感じるかもしれませんが、一度理解してしまえば、様々な場面で応用できる強力なツールになります。

ぜひ実際のプロジェクトで試してみて、衝突制御やオブジェクト管理の効率化を体感してみてください。

この記事をシェア

関連するコンテンツ