エンジニアっぽくなりたい

UnityやUnrealEngine 4などでなにか役に立ちそうなことを発信していく。

UE4 NaviMeshを任意の形に動的に変化させたい

ナビメッシュを動的に変更かけたくなることってありますよね。
ゲームの進行状況だったり、同じレベルだけど別の用途で使いたいときだったり、特定のものがあるときは通れない(もしくは別の道を優先するようになる)とか。
いろいろ調べてみると、設定を「Dynamic」にすることで解消できる!というのを多く見かけました。
確かに求めていることを実現することはできますが、処理負荷が非常に心配です。
今回は「Dynamic」設定にしないで対応する方法を検討してみます。


目標


NavModifierを使ってナビメッシュの動的変更を行う。
ナビメッシュの「RuntimeGeneration」は「Dynamic Modifiers Only」を使用する。

環境

・UE 4.26.2 (エンジンビルドはしていません)

前準備

ナビメッシュをレベルに設定して可視化

とりあえず何もないレベルにナビメッシュを設定して、表示するようにします。
f:id:naoxgames:20210530213603p:plain
こちらは新規レベルを作成してナビメッシュバウンズボリュームを配置してサイズを変更しただけのレベルです。
※手順は以下
f:id:naoxgames:20210530213205p:plain
でレベル作成。
f:id:naoxgames:20210530213430p:plain
でナビメッシュを張り
f:id:naoxgames:20210530213624p:plain
で可視化しています。※もし表示されない場合は「ビルド」から「パスをビルド」を行ってください。
f:id:naoxgames:20210530213828p:plain


ランタイム設定を変更

ナビメッシュの更新設定を変更します。
プロジェクト設定→「エンジン」→「ナビゲーションメッシュ」→「ランタイム」→「Runtime Generation」
ここを「Dynamic Modifiers Only」に設定します。
f:id:naoxgames:20210530214045p:plain


これで必要な設定は完了しました。


やってみる

アクターを作成

作戦としては「NavModifier」コンポーネントを使ったアクターでNaviMeshを動的に変更します。
まずはアクターを作成します。
ここでは「BP_NavModTest」とします。
今回は「Cube」を使うこととします。
f:id:naoxgames:20210530224724p:plain

キューブの「Can Ever Affect Navigation」のチェックをオフにします。
f:id:naoxgames:20210530224825p:plain

「NavModifier」コンポーネントを追加します。
f:id:naoxgames:20210530225327p:plain

これでアクターの設定は完了です。


ナビメッシュを変化させる(Editor時)

先ほどのレベルに配置してみましょう。
f:id:naoxgames:20210530231432p:plain
キューブの形にナビメッシュが切り取られました。

試しに回転やスケールを編集してみましょう。
f:id:naoxgames:20210530232537p:plain
アクターの形に合わせて切り取られているのがわかります。


ナビメッシュを変化させる(実行時)

実行時用の対応をします。
まずは先ほど作成した「BP_NavModTest」に以下のようなイベントを作成します。
f:id:naoxgames:20210531002346p:plain
処理の内容はNaviMeshに対して行う処理と見た目の表示/非表示、コリジョンの有効/無効を設定しています。

次に、レベルブループリントで「BP_NavModTest」のリファレンスを作成し、キーで操作できるようにします。
ここでは以下のように設定しました。
f:id:naoxgames:20210531001949p:plain
「1」を押したときにナビメッシュを切り抜く、表示、コリジョン有効。
「2」を押したときにナビメッシュはそのまま、非表示、コリジョン無効。
となります。

これで実行してみると以下のようになります。
f:id:naoxgames:20210531002810g:plain

また、回転をさせ続けてみると以下のようになります。

f:id:naoxgames:20210531004059g:plain


このように、動的に変化をつけることができました。
※ランタイムのナビメッシュ表示は以下
@キーを押して「show Navigation」
f:id:naoxgames:20210531005427p:plain


思ったこと

「Dynamic Modifiers Only」の設定で実現できました。
とりあえず、「Dynamic」にするのは規模感にもよりますがもう少し他の手を探したほうがいいかと思います。
実際にゲームで使用するレベルでその負荷に耐えられるのか、各アクターの設定(「Can Ever Affect Navigation」とか)を適切に設定する必要があるなど、いろいろと考えることがあると思われます。
今回は単純な形で動的な変形をさせましたが、複雑なメッシュの形に合わせた対応方法もあるので、また別の記事で記述させていただきます。
※といってもエンジニア側の対応は変わらず、デザイナーのモデルの設定によるものになります。


正しい対応方法やより良い方法があればご指摘お願いいたします!!!