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

GameProgrammar's Night

ゲームプログラム系の覚え書き

UnrealEngine4で2Dゲームを作ろう! その7 NavMeshでナビゲーション!

 Pawnを任意場所に良い感じに移動するために、NavigationというシステムがUE4にはあります。
 ドキュメントとしては、ビヘイビアツリーの所にまとめてらていますが、あまりちゃんと書かれて無いです。一応、このへん

 いわゆるナビゲーションメッシュを計算して、それに基づいて向かう方向を決めてくれるというものです。

 使い方は、NavMeshBoundsVolumeで良い感じに移動させたい範囲を囲むとナビゲーションメッシュが生成され、MoveTo系ノード(AI Move To/Simple Move To Locationなど)を使うことでPawnを良い感じに移動してくれます。

 コリジョンをベースにナビゲーションメッシュが作成されますので、モデルやスプライトの見た目通りに移動させたい時はコリジョンを細かくする必要があります。

 さて、この辺りをいじっていてハマったことをメモします。

アクターの配置とNavMesh

f:id:katze_7514:20150702001725p:plain

 テキトーにActorを置くと上図の右側のキャラのように、キャラの周りにNavMeshが計算されません。これはActorのコリジョンによってその範囲に侵入できないとされてしまうからです。
 これでは、あらかじめ敵を配置しておくなどのことができなく非常に面倒です。左上のキャラのようにアクターは配置するが、NavMeshは計算された状態にしたい所です。

 それには、アクターのコリジョンコンポーネントを選択、NavigationカテゴリのDynamic Obstacleにチェックをいれることで可能です。

f:id:katze_7514:20150702002355j:plain

AIControllerが必須

 NavigationシステムはPawnのControllerがAIControllerであることを要求します。
 コードをざっと見る限り、PathFollowingComponentさえ持ってれば大丈夫なので、PlayerControllerであってもPathFollowingComponentを持たせれば大丈夫に見えますが誰か試してくださいw
 まー、クリックした位置にキャラが移動するタイプのハスクラとかを作る時は、PlayerControllerでもNavigationして欲しいので、できるようになっている気はします。

Navigationに基づいて移動させるMoveTo

 ナビゲーションの情報を使いながら移動してくれるノードがUE4にはあらかじめ用意されています。MoveToノードです。いくつか種類がありますが使い方は同じで、向かうActorもしくは座標を指定して呼び、処理が終了するまでノードに止まり、終了すると次の処理に進みます。TimelineやDelayなどと同じ挙動をします。
 ただ、Timelineノードと違い実行中に処理を挟むことができませんので、目的地へ移動する途中で処理を挟みたい時は外からいじってあげる必要があります。例えば、PawnのTickでMoveToを使って、ControllerのTickで監視するなど。

 AI Move To/Simple Move to Actor/Simple Move to Locationあたりが、とりあえず、動かすには便利です。

f:id:katze_7514:20150702011917j:plain

MoveToを使うにはNavMovementComponentが必須

 MoveTo系ノードは、パスを検索しながら動くべき方向のベクトルを速度として、Pawnが持っているNavMovementComponentに設定しにいきます。
 4.8.1現在、NavMovementComponentを継承したMovementComponentは、FloatingPawnMovementとCharacterMovementです。Floatingの方はまだちゃんと実装できてないようです。最大速度設定が効いておらず、一瞬で目的地に移動してしまいます。[UE4.9]にて、最大速度が効くようになりました。

www.youtube.com


Navigation関係のログを見る

 Navigation関係のログはVisualLoggerに出力されますので、Navigationのテスト中はVisualLoggerを有効にしておきましょう。

2DでのNavigation

 動画を見ての通り、2Dでも動いてくれるのですが、MoveToで動かそうと思うと現状は実質的にCharacterMovementが必須です。
 CharacterMovementは2Dゲーにはオーバースペックかつ移動に回転がついてしまうので、ちょっと使いにくいんですよねぇ。
 将来的にPaperCharacterMovementができることが祈りつつ、自前でNavPathを辿るComponentでも作るしかないかなー、と思っている所……。