読者です 読者をやめる 読者になる 読者になる

【UE4】RootComponent以外のCollisionを移動時の衝突判定に使う方法と問題点

UE4

0.目次


1.はじめに

RootComponent以外のCollisionを移動時の衝突判定に使う方法がありましたのでメモしておきます

追記:Characterですと上手く機能しませんでした。Pawn(もしくはFloatingPawnMovement)でないとダメなのかもしれません

バージョン:4.15


2.RootComponent以外のCollisionを移動時の衝突判定に使える場合何が嬉しいか

以下の画像のように設計したいとします。

f:id:tamfoi:20170314045921p:plain

Playerや各Enemyは様々な形をしていると思うので、使いたいCollisionの形も様々だと思います。

しかし、移動時のSweepのことを考えるとRootComponentにCollisionを指定しなければならないのでこの設計ですとPawnBaseの時点でCollisionの形を一つに決めてしまわなければなりません。

ですので、Collisionの形を変える可能性があるのならこの設計は諦めてActorComponent等になるべく処理を流してPawnにAttachしていくという風になるかと思います。

仮にRootComponent以外のCollisionを移動時の衝突判定に使えれば、PawnBaseにはSceneComponent等を指定しておいてCollision自体は継承先で作るという風に出来ます。


3.RootComponent以外のCollisionを移動時の衝突判定に使う方法

まず、以下のようにPawnを組んだとします。

f:id:tamfoi:20170314052612p:plain

この状態で、特に何もせずに移動処理を組むと以下のように壁を貫通します。

f:id:tamfoi:20170314053252g:plain

そこで、以下のようにすればRootの子であるCapsuleを移動時の衝突判定に使うことが出来ます。

f:id:tamfoi:20170314053642p:plain

以下のようにCapsuleが考慮されるようになりました

f:id:tamfoi:20170314053937g:plain


4.問題点と対策案

上記のGIFを見ていると分かると思いますがRootの子であるArrowが取り残されていることがわかると思います

この方法を使うと指定されたComponentを親から相対的に移動させるという結果になるからです…困りました…SetActorLocationなどを使う場合に思ったようにいかなくなります…対策をいくつか考えてみました

SetActorLocationの代わりに次のような関数で対応できます

f:id:tamfoi:20170314055630p:plain

GetActorLocationの代わりに次のような関数で対応できます

f:id:tamfoi:20170314060112p:plain

そもそも、常にRootの位置を同期すればいいので、以下のようにすれば上記の関数を作らなくても良いかもしれません

f:id:tamfoi:20170314061858p:plain


5.おわりに

地味にこの方法ですとCapsuleを回転させることが出来るので嬉しいです

まだ軽く試した程度なので、まだ気づいていない問題点もあるかもしれません