UnityでのOnTriggerEnterとGetComponentの使い方


~ColliderとGameObjectの関係を図で理解する~

はじめに

Unityで当たり判定を処理するとき、OnTriggerEnter(Collider other) の中で相手オブジェクトのコンポーネントを取得する場面は頻繁に登場します。

例えば次のようなコードです。

other.GetComponent<ItemController>().dropSpeed = 0;
other.gameObject.GetComponent<ItemController>().dropSpeed = 0;

どちらも正しく動きますが、「なぜ同じなのか?」「どちらを使うべきか?」と疑問を持ったことはありませんか?

この記事では、この疑問を整理し、ColliderとGameObjectの関係を図で理解できるように解説します。


1. OnTriggerEnter の other とは?

void OnTriggerEnter(Collider other)

ここで渡される other は 接触した相手オブジェクトの Collider コンポーネント です。

つまり GameObject そのものではなく、GameObject にアタッチされた「部品(Component)」を指しています。

例:Apple というオブジェクトの場合

GameObject(Apple)
 ┣ Transform
 ┣ MeshRenderer
 ┣ Collider ← other が参照する
 ┗ ItemController

2. GetComponent の仕組み

Unityの GetComponent<T>() は「呼び出したオブジェクトが属する GameObject からコンポーネントを探す」メソッドです。

  • other.GetComponent<ItemController>()→ other(Collider)が所属している GameObject から ItemController を探す。
  • other.gameObject.GetComponent<ItemController>()→ other の親である GameObject を明示的に指定し、その中から ItemController を探す。

結果的に、どちらも同じ GameObject が検索対象となるため、同じ結果が得られます。


3. 実際のコード例

void OnTriggerEnter(Collider other)
{
    // どちらも同じ結果になる
    other.GetComponent<ItemController>().dropSpeed = 0;
    other.gameObject.GetComponent<ItemController>().dropSpeed = 0;
}

この場合、どちらの書き方でも Apple にアタッチされている ItemController が取得され、dropSpeed が 0 に設定されます。


4. どちらを使うべきか?

両方とも動きは同じですが、使い分けのポイントは 可読性と学習段階です。

  • 学習段階・チーム開発other.gameObject.GetComponent<ItemController>()→ 「Collider は部品、GameObject が親」という関係が明示され、誤解を避けやすい。
  • 個人開発・熟練者other.GetComponent<ItemController>()→ 簡潔に書ける。冗長さを省きたいときに便利。

まとめ表

書き方特徴推奨シーン
other.GetComponent<ItemController>()短く書ける。内部的にGameObject検索に委譲される熟練者、個人開発
other.gameObject.GetComponent<ItemController>()明示的で分かりやすい。学習者にも安心学習・チーム開発

5. フローを図で理解する

以下のシーケンス図を見ると、other.GetComponent が内部的に GameObject へ委譲されることが分かります。

活用できるジャンル

いい視点ですね!

「当たり判定の相手の情報を得て処理を分岐する」 という仕組みは、ゲームだけでなく業務系アプリでも多用されます。ジャンルごとに整理すると以下のようになります。


1. ゲーム分野でのジャンル

アクションゲーム

  • プレイヤーが敵やアイテムと接触 → ダメージや得点処理
  • 例:マリオがコインを取る、敵にぶつかってライフ減少

シューティングゲーム

  • 弾丸と敵機が衝突 → 敵を破壊、スコア加算
  • 例:スペースインベーダー、FPS でのヒット判定

パズルゲーム

  • ピース同士の衝突や位置判定 → 揃ったら消去
  • 例:落ち物パズル(テトリス、ぷよぷよ)

レースゲーム

  • 車同士の衝突、コース外判定、アイテム取得
  • 例:マリオカートでのアイテムボックス取得

スポーツゲーム

  • ボールとプレイヤーやゴールとの接触
  • 例:サッカーゲームのゴール判定

2. 業務系アプリでの応用ジャンル

Unity や類似フレームワークを使った シミュレーション系業務アプリ に多いです。

物流・倉庫システムシミュレーション

  • 荷物がコンベアやフォークリフトと接触 → ピッキングや仕分け処理

ロボット制御・工場シミュレーション

  • ロボットアームが部品をつかむ(当たり判定で接触を検知)

医療シミュレーション

  • 手術訓練で器具と臓器が接触 → 正しい処置かどうか判定

建築・防災シミュレーション

  • 人のモデルと避難経路の衝突判定 → 通路の混雑検証
  • 火災シミュレーションで炎と人モデルの接触 → 被害判定

3. 共通する特徴

  • 相手のオブジェクトを識別(tag や name)
  • 接触によってイベントが発生
  • その情報を基に状態変化やスコア処理を行う

まとめ

  • ゲーム分野:アクション、シューティング、レース、スポーツ、パズルなど「接触や衝突」が遊びの核になるジャンル。
  • 業務アプリ分野:物流、ロボット、医療、建築など「物理的接触や衝突をシミュレーションして結果を得る」ジャンル。


全体まとめ

  • other は Collider コンポーネント
  • GetComponent は 所属GameObjectから検索するため、両方の書き方で同じ結果になる
  • 学習やチーム開発では 明示的な書き方がおすすめ
  • 熟練者はシンプルに書いてOK
  • シーケンス図で見ると、両者が同じ ItemController を返すことが直感的に理解できる

このブログ記事を読んだ方は、ぜひ自分のプロジェクトで 両方の書き方を実際に試してみてください。違いがないことを体験することで理解が深まります。


訪問数 4 回, 今日の訪問数 4回

Unity,当たり判定

Posted by hidepon