BLOGブログ

2019.02.21その他

[UE4] LocalNavigationGrid って何だろう?

執筆バージョン: Unreal Engine 4.21

 

Navigationについて調べていたら”Add Local Navigation Grid for …”を見つけました。「LocalNavigationGridって何?」と思って検索してみたら中々出てこないので自分で調べてみたいと思います。

※C++をみたらUCLASS(Experimental)と書かれていましたので試験的な機能だと思います。またコメントにTODOがあったのでこれから拡張されていくみたいです。ご注意ください。

 

予想してみる

いい機会なので最初に名前とかBlueprintに公開されている関数から機能を予想してみたいと思います。

1.単純に将棋の盤面みたいなGridのNavigationDataが作成できる。

2.BoxとかCapsuleが追加できるので、NaviMeshをベースとして動的に障害物を追加できる。

 

中身を見る

関係しているソースファイルは以下の4つ

NavLocalGridManager 管理しているクラス。

ブループリントに公開されている関数はココ。

NavLocalGridData Gridデータ用構造体
GridPathFollowingComponent ”PathFollowingComponent”を継承したクラス。

Grid対応用に拡張されている。Navigation移動に必要。

GridPathAIController ”AIController”を継承したクラス。

”GridPathFollowingComponent”を生成している。

AIControllerはコンストラクタしかないので、重要なのは上3つ。

 

LocalNavigationGrid とは

動的なナビゲーションを作成することができるようです。静的なナビゲーションのNaviMeshと合わせてNavigationGridで動的なナビゲーションを作成することで、ゲーム中で動的に生成される障害物に対応することができます。

障害物1つにつき1つのグリッドが生成されパス追跡が行われますが、グリッドを使用する関係上ボックスが使用されているため、ある程度大雑把になります。また、生成する障害物がきりのいい座標にいると基本的には問題ないですが、小数点がある中途半端な位置にあると内部で整形され、ずれます。

下記の画像は内部の実装を見つつ、グリッドを可視化させたものです。(※実際にキャラクターを移動させてみた感じ多分あってると思います…)

赤い点が障害物判定のあるグリッド、黒い線がゲーム中に表示されるオブジェクトになります。

ちなみにゲーム中に表示されるオブジェクトの座標は(X=-489.359589,Y=-74.810089,Z=270.000000)です。

使ってみる

TopDownテンプレートを使用して、SimpleMoveToActorで簡単に動かしてみたいと思います。

 

●移動するキャラクターの準備

1.Characterを継承したBlueprintを作成し、Meshを設定する。ClassDefaultsのAIControllerClassに”GridPathAIController”を設定する。

2.SimpleMoveToActorで移動する実装を書く。

3. TopDownテンプレートのマップに配置する。

 

●障害物の準備

1.Actorを継承させたBlueprintを作成する。

2.BlueprintでActorの位置を中心とし、Box型の障害物を追加する。

引数は以下の通り

Location 中心位置
Extent Boxの大きさ
Rotation ローテーション値
Radius 2D よくわかりませんが、グリッドの大きさに影響が出ます。
Height 高さ
Rebuild Grids GridManageに登録されている複数のグリッドを整理します。

3.TopDownテンプレートのマップに配置する。

 

●動かす

1.zキーでキャラクターを動かしたいので、レベルブループリントに以下の処理を書く。

2.プレイ

まとめ

今回はBoxで行いましたが、他にもPointとCapsuleやGridのセルサイズを変更する関数もブループリントに公開されているのでぜひ触ってみてください。

動的に生成される障害物は悩みの種になることもありますが、NavigationGridはひとつの回避策になりそうです。

ただ、負荷は検証ができていない、まだExperimentalということもあり今後も追っていきたいと思います。また、”GridPathFollowingComponent”のコメントには、「動的な障害物に対する適切な回避策に代わるものではない」と書かれていますので注意していきたいです。