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 を返すことが直感的に理解できる
このブログ記事を読んだ方は、ぜひ自分のプロジェクトで 両方の書き方を実際に試してみてください。違いがないことを体験することで理解が深まります。
ディスカッション
コメント一覧
まだ、コメントがありません