物理演算のイベント
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
系のイベントを呼び出すには、対象のCollider
のIsTrigger
にチェックを入れる必要があります。
これにより、その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 Settings
のPhysics → Settings
にあるLayer Collision Matrix
を適切に設定することで、
物理演算を行う対象を限定し、効率的に処理を軽減できます。
Playerの攻撃を敵にのみ当て、味方キャラクターには当たらないようにする、といった調整ができます。
まとめ
今回は物理イベントについて解説しました。
OnCollision
系 → 壁や地面への衝突、敵との接触を判定OnTrigger
系 → 特定エリアへの侵入や攻撃判定の適用
引数から接触したオブジェクトを判定し、適切な処理を行いましょう。
特に、アクションゲームやシューティングゲームなど、当たり判定が重要なジャンルで活用されます。