前回の記事ではオブジェクトに物理演算を適用させて動かしましたが、動かしたらやっぱりぶつかった時になにかしたいものです。今回はそのぶつかったりした時はどのように検出できるのかを書いていきます。
衝突の検出
衝突の検出と書いてありますが、判定できるのはオブジェクトが触れた時、オブジェクトが離れた時、オブジェクトが触れている間を検出することが出来ます。実際に検出するタイミングはColliderとColliderが衝突した時です。それぞれのイベントが起きた時、以下のメソッドを検出したいオブジェクトにアタッチされているスクリプトに記述してあると、それぞれのタイミングで呼び出されます。
1 2 3 4 5 6 7 8 9 10 11 |
//オブジェクトが衝突したとき void OnCollisionEnter(Collision collision) { } //オブジェクトが離れた時 void OnCollisionExit(Collision collision) { } //オブジェクトが触れている間 void OnCollisionStay(Collision collision) { } |
オブジェクトがぶつからずに衝突を検出したい
何を言っているのかわからないかもしれませんが、例えばゴール地点などに入ったかどうかを検出したい場合があるとします。今までと同じ方法だとゴール地点にぶつかることは出来ますが、中に入ることはできません。そのような、衝突はしてほしくないがその中に入っているかどうかを検出したい場合は、ColliderのIsTriggerをtrueにすることで、物体の衝突は行われないまま衝突判定ができるようになります。多くの場合、このように判定だけ検出したい場合はレンダラーをオフにして透明なオブジェクトにすることが多いです。
この場合も、オブジェクトが触れた時、離れた時、触れている間を検出することができます。
1 2 3 4 5 6 7 8 9 10 11 |
//オブジェクトが衝突したとき void OnTriggerEnter(Collision other) { } //オブジェクトが離れた時 void OnTriggerExit(Collision other) { } //オブジェクトが触れている間 void OnTriggerStay(Collision other) { } |
ちなみにIsTriggerをtrueにしているとオブジェクト同士が衝突しない=物理演算が行われないので、RigidBodyが付いているオブジェクトでIsTriggerをtrueにすると地面をすり抜けて落ちていってしまいます。
終わりに
今回はオブジェクトの衝突判定について書きました。正直メソッドを一個書くだけで終わってしまうので、かなり楽に扱えます。昔は毎フレーム座標計算したりして衝突したのかどうかを書いていたりした時もありましたが、すべてやってくれるのがゲームエンジンの便利なとこです。
今回衝突が検出できたので、次回はこの衝突した時などに音を鳴らしてみたいと思います。
では、また。