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

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

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を回転させることが出来るので嬉しいです

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

【UE4】AIを空中で移動させる時に使えそうなノード

0.目次


1.はじめに

AIの移動処理を作る時に地上ならばナビメッシュがあるのでAIMoveToなどを使えば簡単に作れますが、空中ですと現状のUE4ではナビメッシュが無いので使えるものと使えないものがあります。
今回はよく使いそうなノードでどれが空中で使用出来るか調べたもののまとめです。

バージョン:4.15  


2.移動に使うノードと空中での使用可否

※MovementComponentにはFloatingPawnMovementを使用しています

ノード名 使用可否 補足
AIMoveTo ×
MoveToLocationorActor UsePathfindingを外せば使用可能。Accelerationは考慮されず最大速度で移動する
SimpleMovetoActor ×
SimpleMovetoLocation ×
MovetoLocation UsePathfindingを外せば使用可能。Accelerationは考慮されず最大速度で移動する
MovetoActor UsePathfindingを外せば使用可能。Accelerationは考慮されず最大速度で移動する
AddMovementInput Accelerationが考慮される。Taskで瞬間的に呼んでしまうとほんの少ししか移動しない上にスピードがいつまで経ってもでないのでService等で毎フレーム呼ぶかDelayで少し待ってからFinishExcuteを呼ぶ等の工夫をする
AddInputVector Accelerationが考慮される。こちらもAddMovementInputと同様Taskで瞬間的に呼んでしまうと問題があるかと思います
AddActorXXOffset 可変フレームへの対応をする必要あり。FloatingPawnMovementを完全に無視した状態になります
SetActorXXLocation 可変フレームへの対応をする必要あり。FloatingPawnMovementを完全に無視した状態になります

3.おわりに

どのノードも一長一短な感じで悩みます。こうしたら良いよとか楽だよっていうのがあったら教えてほしいです。
RoborecallのDroneの実装を見たのですがMoveToLocationが使われていました。(というか移動はどのAIも同じものを使ってるっぽいです)
あと驚いたのですがUsePathfindingがONの状態で使われていたので、私の使い方が良くないのか、もしくはナビメッシュを拡張しているのかもしれません。ナビメッシュの表示をしてみたら色々違います(特にジャンプポイントの量に驚いた)

【UE4】VectorFieldをBlenderで作る-導入編-

0.目次


1.はじめに

VectorFieldについてはドキュメントが参考になると思います

docs.unrealengine.com

docs.unrealengine.com

本来であればMaya等を使用して作成するのですがBlenderで作成出来るようにするプラグインをフォーラムで公開してくれています

今回は導入までのメモです


2.Blenderを用意

プラグインの都合で古いバージョンでないと動きません

今回は、2.70aを使用しました


3.Blender Vector Field Editorをダウンロード

下記リンクにGitHubへのリンクがありますのでダウンロードします

forums.unrealengine.com


4.Blenderプラグインを導入

ダウンロードしたzipを解凍するとFGA_VectirFieldsがあると思います

それを「blenderのあるディレクトリ\blender-2.70a-windows64\2.70\scripts\addons」の中にいれます(Blender内からインストールする方法もあります)

Blenderを起動し、ユーザー設定->アドオンを開きます

そこで「FGA Vector Field Tools」を探して有効化します

プラグインが導入出来ていれば下記のようにParticleSimulationというタブが追加されています

f:id:tamfoi:20170212192524p:plain


5.Blender Vector Field Editorの使い方

詳しい使い方は先程紹介したフォーラムにwikiへのリンクがあるのでそちらを参照してください(私もまだ把握出来てません)

作ったものはfga形式でエクスポート出来るのでそれをUE4に持っていってGPUパーティクルで使用します


6.おわりに

適当に弄ってみて次のようなものが出来ました

【UE4】独自のコリジョンプリセット等を追加する方法

0.目次


1.はじめに

メッシュやコリジョン等の詳細やLineTrace等で選択する

  • ObjectChannels(ObjectType、オブジェクトチャンネル、オブジェクト応答)

  • TraceChannels(トレースチャンネル、トレース応答)

  • CollisionPreset(コリジョンプリセット)

を追加する方法です。

f:id:tamfoi:20170126222139p:plain f:id:tamfoi:20170126222913p:plain

バージョン:4.14


2.プロジェクト設定を開く

プロジェクト設定->エンジン->Collisionを開くと以下の画面になります

f:id:tamfoi:20170126223404p:plain


2.1.ObjectChannelsを追加する

ObjectChannelsの新規オブジェクトチャンネル…を押すと次の画面が出ます

f:id:tamfoi:20170126223742p:plain

設定を済ませて承認すると以下のようになります

f:id:tamfoi:20170126223937p:plain

コリジョンの設定で選べるようになっているはずです

f:id:tamfoi:20170126224150p:plain


2.2.TraceChannelsを追加する

TraceChannelsの新規トレースチャンネル…を押すと次の画面が出ます

f:id:tamfoi:20170126223742p:plain

設定を済ませて承認すると以下のようになります

f:id:tamfoi:20170126224533p:plain

コリジョンの設定やLineTraceで選べるようになっているはずです

f:id:tamfoi:20170126224855p:plain f:id:tamfoi:20170126224900p:plain


2.3.CollisionPresetを追加する

Presetの新規…を押すと次の画面が出ます

f:id:tamfoi:20170126225537p:plain

設定を済ませて承認すると以下のようになります

f:id:tamfoi:20170126225552p:plain

コリジョンの設定で選べるようになっているはずです

f:id:tamfoi:20170126225618p:plain


3.おわりに

透明な壁があって弾は貫通するけど、人は通れないとか…設定したくなったら使うと思う

設定しだすと沼にハマりそう

【UE4】対象のActorが前後、左右、上下のどこにいるのか判定する方法

0.目次


1.はじめに

対象のActorが自分の前後左右、上下どこにいるのか判定する方法のメモ

バージョン:4.14


2.前後判定

f:id:tamfoi:20170121214358p:plain


3.左右判定

f:id:tamfoi:20170121214420p:plain


4.上下判定

f:id:tamfoi:20170121214428p:plain