【UE4】RootComponent以外のCollisionを移動時の衝突判定に使う方法と問題点
0.目次
- 0.目次
- 1.はじめに
- 2.RootComponent以外のCollisionを移動時の衝突判定に使える場合何が嬉しいか
- 3.RootComponent以外のCollisionを移動時の衝突判定に使う方法
- 4.問題点と対策案
- 5.おわりに
1.はじめに
RootComponent以外のCollisionを移動時の衝突判定に使う方法がありましたのでメモしておきます
追記:Characterですと上手く機能しませんでした。Pawn(もしくはFloatingPawnMovement)でないとダメなのかもしれません
バージョン:4.15
2.RootComponent以外のCollisionを移動時の衝突判定に使える場合何が嬉しいか
以下の画像のように設計したいとします。
Playerや各Enemyは様々な形をしていると思うので、使いたいCollisionの形も様々だと思います。
しかし、移動時のSweepのことを考えるとRootComponentにCollisionを指定しなければならないのでこの設計ですとPawnBaseの時点でCollisionの形を一つに決めてしまわなければなりません。
ですので、Collisionの形を変える可能性があるのならこの設計は諦めてActorComponent等になるべく処理を流してPawnにAttachしていくという風になるかと思います。
仮にRootComponent以外のCollisionを移動時の衝突判定に使えれば、PawnBaseにはSceneComponent等を指定しておいてCollision自体は継承先で作るという風に出来ます。
3.RootComponent以外のCollisionを移動時の衝突判定に使う方法
まず、以下のようにPawnを組んだとします。
この状態で、特に何もせずに移動処理を組むと以下のように壁を貫通します。
そこで、以下のようにすればRootの子であるCapsuleを移動時の衝突判定に使うことが出来ます。
以下のようにCapsuleが考慮されるようになりました
4.問題点と対策案
上記のGIFを見ていると分かると思いますがRootの子であるArrowが取り残されていることがわかると思います
この方法を使うと指定されたComponentを親から相対的に移動させるという結果になるからです…困りました…SetActorLocationなどを使う場合に思ったようにいかなくなります…対策をいくつか考えてみました
SetActorLocationの代わりに次のような関数で対応できます
GetActorLocationの代わりに次のような関数で対応できます
そもそも、常にRootの位置を同期すればいいので、以下のようにすれば上記の関数を作らなくても良いかもしれません
5.おわりに
地味にこの方法ですとCapsuleを回転させることが出来るので嬉しいです
まだ軽く試した程度なので、まだ気づいていない問題点もあるかもしれません