nikeeshi のコーディング記

コーディングの成果をはっつけるとこ。このブログにあるソースコードはNYSL Version 0.9982に従い公開します(2014/06/18)。

Unityの衝突判定

概説

Unityで、衝突判定をすると言えば、ColliderとRigidbodyを使うという方法があります。ただし、これは無茶がやりづらい仕様になっているので、全部Scriptで管理したい僕は悩んでしました。あるとき、無料のAssetを読んでいると、Physicsを使った衝突判定をしているのを見つけました。「これは便利かもしれない」そう思い、僕はPhysicsを勉強することにしました。

ColliderとRigidbodyを使った衝突判定

Unity - Manual: Colliders

正確なことを知りたい場合上を参照。

Rigidbodyは剛体です。Colliderは直訳すると衝突するものですが、意訳すると形状です。 親Game ObjectにRigidbodyをつけて、それ以下のGame ObjectにColliderをつけると、Colliderが他のColliderと接触したというイベントをRigidbodyで受け取れるようになります。

こうして作ったRigidbody Colliderは剛体として物理演算で動きを制御されることになります。

動きをScriptで制御する場合、Kinematic属性(属性という名前は今適当につけた)をRigidbodyにつけます。その代わり、そのRigitbodyは物理演算制御のRigidbody以外との衝突イベントを受け取りません。

ここで注目すべき点は、剛体をScript制御する(言葉面から見ておかしなことをしているのはわかると思う。)とそれら同士の衝突イベントが得られないということです。

Triggerを使った衝突判定(?)

TiggerはColliderの属性の一つです。 Triggerというのは「衝突は検知するけどぶつからないもの」です。 例えば、自動ドアの前にTriggerを設置してキャラクターが自動ドアを通過しようとすると、それを検知してドアをあけるというのが表現できます。

これを衝突判定に使おうとするとどうなるか。どのRigidbodyと衝突したかという情報しか得られません。しょうがないのです。それがTriggerです。

第3の方法

Unityの公式Assetの2D Platformerを読んでみましょう。PlayerControlやEnemyでPhysics2Dというのが出てきています。

いわゆるUtilityクラスで、この中の便利な静的関数を利用するというものです。

交差判定などがありそうな気がします。ぷんぷんします。

これら(あるかどうかはわからない)を使って自分なりの物理演算をしようと思います。

あとがき

僕が横断的な学習を行っていたばかりに、Physicsの関数を使うということに気付かなかった。どの衝突判定のチュートリアルにも書いてあるような基礎的な内容だ。とても反省している。