今回のテーマは、「衝突処理イベントの種類について」です。
Unityにおける衝突判定の処理は各種場面によって使い分けれるように用途にあった複数のイベントが用意されています。
この記事では、各イベントがどのような処理になっているかを解説します。どんなイベントが、どんな場合に発生し利用できるかを理解しその都度、適したイベントを利用できるように準備しておきましょう。
衝突イベントの種類
衝突イベントはTrigger、Collision、Controllerに属する3種類に分かれます。
Triggerを使用した場合
OnTriggerを使用したイベント処理は、ゴールエリアなど一定の範囲に入った場合などに利用できます。
ColliderのIs Triggerにチェックを入れることで衝突なしでコールバックが呼び出されます。
イベント | 説明 |
---|---|
OnTriggerEnter | オブジェクトが領域に入った場合に起きるイベント |
OnTriggerExit | オブジェクトが領域から出た場合に起きるイベント |
OnTriggerStay | オブジェクトが領域の中にいる間発生するイベント |
OnTriggerイベントを利用することで、以下のように指定した領域に入った場合にイベント処理するスクリプトを作成できます。
OnTriggerの場合は、コライダーがついておりIs Triggerにチェックが入っていることがです。
以下は指定領域に入った際に、オブジェクトを生成するサンプルコードです。
public GameObject position;
public GameObject target;
void OnTriggerEnter()
{
//領域に入った際にオブジェクトを生成する
Instantiate(target, new Vector3(position.transform.position.x,
position.transform.position.y,
position.transform.position.z),
Quaternion.identity);
}
Collisionを使用した場合
オブジェクト同士が接触した場合に発生するイベントです。
Contイベント | 説明 |
---|---|
OnCollisionEnter | オブジェクト同士が衝突した場合に発生するイベント |
OnCollisionExit | オブジェクト同士が離れたときに発生するイベント |
OnCollisionStay | オブジェクト同士が衝突している間に発生するイベント |
OnCollisionの場合は、リジッドボディがついていることが条件です。
以下は手榴弾が当たると爆発するプレハブをインスタンス化するサンプルコードです。
public Transform explosionPrefab;
void OnCollisionEnter(Collision collision)
{
ContactPoint contact = collision.contacts[0];
Quaternion rotation = Quaternion.FromToRotation(Vector3.up, contact.normal);
Vector3 position = contact.point;
Instantiate(explosionPrefab, position, rotation);
Destroy(gameObject);
}
CharacterControllerを利用したイベント
CharacterControllerでモデルを制御している場合の衝突処理には、「OnControllerColliderHit」を利用できます。キャラ側のスクリプトに処理を書きたい場合に適しています。
接触時に回復させたり、物を押したりという場面で利用できます。
OnControllerColliderHitは、コライダーがついておりオブジェクトのコンポーネントにCharacter Controllerを利用している必要があります。
以下はキャラクターコントローラーが移動中にコライダーに衝突した際に、呼び出されるサンプルコードです。
public float pushPower = 2.0F;
void OnControllerColliderHit(ControllerColliderHit hit)
{
Rigidbody body = hit.collider.attachedRigidbody;
// リジッドボディなし
if (body == null || body.isKinematic)
return;
// 下のオブジェクトを押さないようにしたい
if (hit.moveDirection.y < -0.3f)
return;
// 移動方向から押す方向を計算する。
// オブジェクトを上下に押すのではなく、横にだけ押します。
Vector3 pushDir = new Vector3(hit.moveDirection.x, 0, hit.moveDirection.z);
// キャラクターが移動しようとする速度がわかっている場合。
// 押し出し速度にそれを乗じることができます。
// プッシュを適用する
body.velocity = pushDir * pushPower;
}
衝突処理のまとめ
今回は、「衝突処理イベントの種類を理解する」について解説しました。
- Triggerを使用した衝突イベント処理
- Collisionを使用した衝突イベント処理
- CharacterControllerを使用した衝突イベント処理
Triggerを利用した衝突処理は領域に関するイベントについて説明しました。
Collisionを利用した衝突処理はオブジェクトの接触に関するイベントについて説明しました。
CharacterControllerを利用した衝突処理はキャラクターコントローラーの接触に関するイベントについて説明しました。
それぞれの衝突処理は、都度適した処理を選択することで衝突イベントを作成しやすくなっています。それぞれの特徴をよく理解し、その時に合った衝突処理を選択できるように準備しておきましょう。
今回の記事が、皆さんの助けになると嬉しいです。
もしこの記事が気に入りましたら、ぜひテクリエイトへのブックマーク登録をして頂けると喜びます。
以上、おつかれさまでした!
© Unity Technologies Japan/UCL