UnrealEngineのコリジョン周りは、高機能だがその分設定がゴチャゴチャしててややこしい。

たまに物理で遊ぼうとするたびに思った通りに動かなくてハマりがちなので、一度一通り試して検証しておきたい。

まず、押さえておきたいのがUnrealEngineでは目に見えるグラフィックの世界以外に、コリジョンの世界があるという事。そしてコリジョン世界は物理シミュレーション世界と空間クエリ世界に分かれている。

Untitled

Untitled

物理シミュレーション世界では、物体は物理法則にのっとって空中から床に落ちたり、蹴ったら飛んでったり、そういう物理的な動きがシミュレートされる。

空間クエリ世界では、物体と物体が重なってるかどうか(オーバーラップ)を検出できる。レイキャストの処理とかも行われる。

今回の検証では、二つのキューブを置いて、左側のキューブを”Set World Location”で右に動かしてもう片方にぶつけてみてどうなるかを確かめる。

設定項目としては、まず”Simulate Physics”がある。これをオンにすると、物理シミュレートが有効になる。

Untitled

ちなみにこれを知っとかないと絶対にハマると思うのが、この”Simulate Physics”をオンにすると、そのコリジョンのコンポーネントが親からデタッチされて、Actor自体のLocationとは無関係に動き回るようになる点だ。つまり、見た目にはあちこちに転がり回ってるように見えて、実はActorのLocationは(0,0,0)のままだったりする。ActorじゃなくてComponentの方の座標を操作する必要がある。(例えば、Sceneコンポーネント参照に対して”Set World Location”を呼ぶ)

“Simulation Generates Hit Events”という項目は、これをオンにしてると物理シミュレーションの動きの中で何かに衝突するたびにHitイベントが発行される。例えばキューブが空中から床に落ちた時はキューブと床の間でHitイベントが起きる。チェックを入れない場合は例えばプレイヤーが移動中にキューブにぶつかった時とかだけHitイベントが起きる。

Untitled

”Generate Overlap Events”という項目は、これをオンにしてないと空間クエリ世界に存在しなくなるみたいな感じになる。だから、今回で言えば両方のキューブで両方”Generate Overlap Events”をオンにしてないとOverlapイベントは発生しない。

Untitled

“コリジョンプリセット”については相手によって自分がオーバーラップになるか、ブロックになるか細かく設定できるが、とりま今回はBlockAllかOverlapAllだけ使う。