🌟

ゲーム開発で必須なUnity×C#×コンポーネント:当たり判定【Collider】の極意

2025/01/17に公開

ゲーム開発で必須なUnity×C#×コンポーネント:当たり判定の極意

Unityでゲームを作るなら、"当たり判定" は絶対に外せない要素のひとつです。敵との衝突やアイテムの取得、障害物に当たったら跳ね返る──こうした演出は、すべて当たり判定を正確に処理してこそ成り立ちます。とはいえ、「どのコンポーネントを使えばいい?」「C#でどう書けばいい?」と疑問を抱いている方も多いのではないでしょうか。
本記事では、Unity×C#×コンポーネントを使った当たり判定の基礎から応用までをわかりやすく解説します。実装の手順や注意点をしっかり把握して、ぶつかり合うゲームの世界観を思う存分に表現しましょう。

当たり判定の重要性

衝突や接触がゲーム性を左右する理由

ゲームにおいて衝突判定は、"結果"を生み出す大きなトリガーです。たとえば:

  • プレイヤーが敵に触れたらHPが減る
  • アイテムを拾ったらスコアが上がる
  • ジャンプして天井に当たったら落下が始まる

もし当たり判定がずれていたり、実装が不十分なら、ゲームのクオリティは下がり、プレイ感が悪くなってしまいます。しっかりコリジョン(Collider)や物理演算を組み込むことで、操作に対する説得力や爽快感を得られるのです。

Unityにおける当たり判定の仕組み

Unityで当たり判定を実装するときは、主に次のコンポーネントを組み合わせます。

  1. Collider / 2D Collider : オブジェクトの境界線
  2. Rigidbody / 2D Rigidbody : 物理演算(運動方程式など)を受け持つ
  3. Collider同士の接触情報 : "OnTriggerEnter" や "OnCollisionEnter" といったメソッドで衝突イベントを受け取る

これらを適切に設定することで、「ぶつかったタイミング」や「触れている間の処理」などをスクリプトでコントロールできます。

当たり判定コンポーネントの基礎

ColliderとTriggerの違い

  • Collider : 物体としての当たり判定を持つコンポーネント。オブジェクト同士が衝突するときに物理的な相互作用を生む。
  • Trigger : "衝突" はしないが、"接触イベント" のみ受け取れる特別なCollider。壁にぶつかることはないが、通過イベントを拾える。

Rigidbodyと物理演算

"Rigidbody" を付けると、Unityの物理エンジンがオブジェクトを動かしてくれます。重力や慣性が働くため、リアルな動きが簡単に再現可能です。ただし、以下の点に注意しましょう。

  • Rigidbodyを付けるときは、移動や回転を物理演算に委ねる設計が基本
  • "Kinematic" モードにすると、重力や衝突の影響を受けないが、Colliderイベントは受け取れる
  • 2Dのプロジェクトでは "Rigidbody2D" を使う
void OnCollisionEnter(Collision collision)
{
    // 衝突した相手をコンソールに表示
    Debug.Log("Collided with: " + collision.gameObject.name);
}

上のように "OnCollisionEnter" を使えば、"衝突" をフックしてゲーム内の処理を行えます。

当たり判定を確実に動かすためのC#実践

MonoBehaviourのメソッドを活用

Unityで当たり判定を取る際、典型的なシグネチャとして以下があります。

  • OnCollisionEnter(Collision collision) : Collider同士が初めて衝突した瞬間

  • OnCollisionStay(Collision collision) : Collider同士が衝突し続けている間

  • OnCollisionExit(Collision collision) : Collider同士が離れた瞬間

  • OnTriggerEnter(Collider other) : Trigger Colliderにオブジェクトが入り始めた瞬間

  • OnTriggerStay(Collider other) : Trigger Colliderにオブジェクトが留まり続ける間

  • OnTriggerExit(Collider other) : Trigger Colliderからオブジェクトが出た瞬間

これらのメソッドをMonoBehaviourスクリプト内で定義しておくと、対応するイベントが発生したタイミングで自動的に呼ばれます。

衝突イベントで実行する処理例

1. HPを減らす・アイテムを取得する

void OnCollisionEnter(Collision collision)
{
    if (collision.gameObject.CompareTag("Enemy"))
    {
        hp -= 10;
        Debug.Log("Enemy collided! HP: " + hp);
    }
}

2. トリガーでスコアアップ

void OnTriggerEnter(Collider other)
{
    if (other.gameObject.CompareTag("Item"))
    {
        score += 100;
        Destroy(other.gameObject);
        Debug.Log("Item collected! Score: " + score);
    }
}

3. 2Dゲームの場合

メソッド名やクラスが Collision2DCollider2D になるだけです。使用感は3Dとほぼ同じ。

void OnTriggerEnter2D(Collider2D other)
{
    if (other.CompareTag("Item"))
    {
        score += 100;
        Destroy(other.gameObject);
    }
}

このように衝突イベントをフックし、C#のスクリプトで自由に動きを付けられます。

当たり判定でよくあるトラブルと対処法

1. イベントが発火しない

  • Colliderが正しく設定されていない可能性
  • Rigidbodyを付けていない、またはKinematicのまま衝突判定が無効になっている
  • "Is Trigger" がオンになっているのに "OnCollision" 系メソッドを使っている
  • 「Updateで無理やり座標を変えていて物理計算が追いついていない」など、設計の問題

対策

  • Colliderの "Is Trigger" チェックを再確認
  • 少なくとも一方のオブジェクトにRigidbodyを付ける
  • 2Dプロジェクトなら "Rigidbody2D" と "Collider2D" / "OnCollisionEnter2D" を使う

2. 複数のColliderが重なりすぎて混乱する

  • キャラクターと武器を分けて当たり判定を取りたいが、全部当たってしまう
  • ボーンや子オブジェクトに大量のColliderがついているため、どれがどれかわからない

対策

タグとレイヤーを使って整理する
  • タグ: どのオブジェクトか素早く特定したいときに使う("Enemy", "Item"など)
  • レイヤー: 衝突させたい/させたくない組み合わせを「Physics > Layer Collision Matrix」で制御する
  • 不要なColliderを削除 or "Is Trigger" にして物理衝突をさせない

3. 物理エンジンの順番制御

物理演算はFixedUpdateで行われるため、"Update" メソッドや"LateUpdate"とのタイミング差で意図しない動きが起こる場合があります。
物理演算に絡む処理はなるべく FixedUpdate 内で書く、あるいは衝突コールバックで直接処理するなど、タイミングを注意しましょう。

発展:当たり判定をさらに活かすコツ

レイキャスト(Raycast)を使った判定

レイキャストとは、「特定の方向に仮想の直線を飛ばし、何かにぶつかったら情報を取得する」仕組みです。

Ray ray = new Ray(transform.position, transform.forward);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, 10f))
{
    Debug.Log("Hit object: " + hit.collider.gameObject.name);
}
  • 銃弾の判定を高速に行いたい
  • 目の前に障害物があるか調べたい
  • NPCがプレイヤーを視認できるか判定したい

こうした場面でレイキャストは非常に便利です。

接触面の情報を使う

"Collision" オブジェクトからは、衝突地点や法線ベクトルなど詳細な情報を取得できます。車のゲームで斜面にぶつかったときの跳ね返りを計算したり、キャラクターが壁の上に乗ったかどうかを正確に判定するときに役立ちます。

Gizmosで可視化する

当たり判定は画面上に見えにくいので、Gizmos機能を使うと開発が捗ります。

void OnDrawGizmos()
{
    // Sphereの当たり判定可視化
    Gizmos.color = Color.red;
    Gizmos.DrawWireSphere(transform.position, radius);
}

シーンビューでColliderやレイキャストの範囲を目視できるため、トラブルシューティングが格段に楽になります。

まとめ:当たり判定はゲームのリアリティを支える大切な要素

Unity×C#×コンポーネントの役割を理解し、正しく当たり判定を扱うことが、ゲーム全体の手触りやリアリティを左右します。ColliderやRigidbodyの組み合わせ、"Trigger" の使い分けなど、基本的なルールをしっかり押さえてください。
さらに、レイヤー管理やレイキャストを積極的に使えば、複雑なシーンでも衝突イベントを的確に制御できます。

あとは実際に試行錯誤あるのみ。シンプルなサンプルシーンで衝突判定を確かめたり、レイヤーを切り替えたりするだけでも、多くの発見があります。ぜひ今回の解説を参考に、思い通りの当たり判定を実装してみてください。

この記事を読んでもっと実践したいと感じたあなたへ

Unity開発を効率よく進めるためには、実践的なスキルと仲間との交流が欠かせません。
そんな方におすすめのステップが、下記の3つです。

1. 有料教材「どこでもUnity教室」でゲーム制作を短期マスター

  • 5日でシンプルなFPS完成:初心者向けに要点を押さえたカリキュラム
  • C#や最新のInputSystem、FPS実装まで網羅:つまずきやすいポイントを先回りで解説
  • 購入特典:Discord招待+サンプルプロジェクトDLで、疑問や実装例を即確認

たった5日でFPSゲームが作れる自分に変わる教材はこちら

https://zenn.dev/ryuryu_game/books/fd28de9d8e963a

2. 無料コミュニティで、疑問をすぐに解消&モチベーションUP

  • 初心者~中級者までOK:学習進度に合わせて質問や情報共有
  • 質問サポートが充実:わからないことを仲間や講師に即相談
  • 学習仲間と切磋琢磨:一緒に学ぶから続けやすい

Discordサーバー参加はこちら

https://discord.gg/5FwuKCacNy

3. 実績豊富な“ゲーム開発所RYURYU”があなたをトータルサポート

  • コナラ総販売200件超:さまざまなUnity開発の依頼を対応
  • VR/AR/AIなど最新技術にも精通:幅広いノウハウを活かして開発支援
  • ゲームクリエイター甲子園や東京ゲームショウなど出展実績多数

ご相談・お問い合わせはこちら

https://coconala.com/users/1772507

Discussion