物理演算のイベント

Unityの物理演算では、オブジェクト同士の衝突接触を検知するために、物理イベントが用意されています。

衝突判定を行う際、OnCollision系とOnTrigger系のイベントには以下の違いがあります。

  • OnCollisionEnter(Collision collision):物理的な衝突が発生したときに呼ばれる
  • OnTriggerEnter(Collider other):トリガーを持つコライダーと接触したときに呼ばれる(物理的な衝突は発生しない)

これらのイベントは、MonoBehaviourを継承したクラス内で定義すると、条件を満たしたときに自動的に呼び出されます。

衝突時:OnCollision系

衝突時のイベントに3種類あります。

イベント発生タイミング用途の例
OnCollisionEnter(Collision collision)衝突した瞬間敵とプレイヤーがぶつかった時のダメージ処理など
OnCollisionStay(Collision collision)衝突中ずっと壁に押し付けられている間の処理など
OnCollisionExit(Collision collision)衝突が終わった瞬間地面から足を離した時のジャンプ判定リセットなど

以下の様なスクリプトを用意することで、衝突時に各イベントが呼ばれるようになります。

public class CollisionTest : MonoBehaviour
{
    private void OnCollisionEnter(Collision other)
    {
        Debug.Log($"衝突開始:{other.gameObject.name}");
    }
    
    private void OnCollisionExit(Collision other)
    {
        Debug.Log($"衝突終了:{other.gameObject.name}");
    }
    
    private void OnCollisionStay(Collision other)
    {
        Debug.Log($"衝突中:{other.gameObject.name}");
    }
}

コンポーネントをキューブに追加して、上空から落とした際に地面との接触でログが表示されます。

接触時:OnTrigger系

進入時のイベントも3種類あります。

イベント発生タイミング用途の例
OnTriggerEnter(Collider other)すり抜けるコライダーに入った時エリア侵入検知、アイテム取得など
OnTriggerStay(Collider other)すり抜けるコライダーの中にいる間エリア内の継続的なダメージ
OnTriggerExit(Collider other)すり抜けるコライダーから出た時安全エリアから離れたときの警告

OnTrigger 系のイベントを呼び出すには、対象のColliderIsTriggerにチェックを入れる必要があります。

これにより、そのColliderは衝突判定を行いつつ、物理的にはすり抜けるようになります。

以下の様なスクリプトを用意することで、接触時に各イベントが呼ばれるようになります。

public class TriggerTest : MonoBehaviour
{
    private void OnTriggerEnter(Collider other)
    {
        Debug.Log($"接触開始:{other.gameObject.name}");
    }
    
    private void OnTriggerExit(Collider other)
    {
        Debug.Log($"接触終了:{other.gameObject.name}");
    }
    
    private void OnTriggerStay(Collider other)
    {
        Debug.Log($"接触中:{other.gameObject.name}");
    }
}

中央のキューブにコンポーネントを追加すると、一回り大きい緑のColliderを通過するたびにログが表示されます。

物理判定を行う対象を限定する

多数のオブジェクトがある場合、すべてに物理演算を適用すると処理負荷が増大します。

Project SettingsPhysics → SettingsにあるLayer Collision Matrixを適切に設定することで、

物理演算を行う対象を限定し、効率的に処理を軽減できます。

Playerの攻撃を敵にのみ当て、味方キャラクターには当たらないようにする、といった調整ができます。

まとめ

今回は物理イベントについて解説しました。

  • OnCollision系 → 壁や地面への衝突、敵との接触を判定
  • OnTrigger系 → 特定エリアへの侵入や攻撃判定の適用

引数から接触したオブジェクトを判定し、適切な処理を行いましょう。

特に、アクションゲームやシューティングゲームなど、当たり判定が重要なジャンルで活用されます。

🔗関連ページ