はじめに
ORENDAでは営業職をしておりますが、ORENDAの営業職にはゲームエンジンを使いこなせるメンバーも多いです。今回は、Unreal Engine 4(以下UE4)の便利機能を使う事で誰でも簡単に開発を行えるような事例を紹介致します。
今回テーマとなるのは、NPCや敵AIを作る際に良く使う「Navigation Mesh」の便利な使い方をご紹介したいと思います。
この記事の内容
「Navigation Mesh」の機能を応用した使い方で、プレイヤーが操作できる範囲を簡単に生成する方法を紹介します。
用意するもの
- Windows10
- Unreal Engine 4.26
通常の作り方について
プレイヤーが操作するキャラクターが移動できる範囲を設定していないとどのような事が起こるのかといった疑問があると思います。一つの事例として、下記画像のようになります。
この状態では、ユーザーに遊んで欲しい道筋を辿るのがとても難しくなります。
その結果、「BlockingVolume」や「スタティックメッシュ」を使って当たり判定を付けてキャラクターが落ちないようにするのが一般的な方法としてあります。
コリジョン付きの「StaticMesh」の例
「Blocking Volume」の例
画像のような方法を使うと、アウトライナ上にたくさんのActorを配置しなければならず管理も大変になります。サブレベルで分けて管理する方法もありますが、今回の本題である「Navigation Mesh」を使って簡単に範囲を作る方法を「応用例」で紹介します。
応用例
サードパーソンのテンプレートを用意します。
不要な壁を削除して、「Nav Mesh Bounds Volume 」を画像のように床に配置します。
配置座標は、x「-390」y「0」z「210」
ブラシ形状は、x「3000」y「2000」z「500」
配置が完了したら、エディタ上にカーソルを合わせてキーボードの「P」を押すと下記画像のように移動できる領域が可視化されます。
この領域を動けるようにするためのBlueprintを作成していきます。
アウトライナで「ThirdPersonCharacter」を選択して、右側にある「ThirdPersonCharacterを編集」をクリックしてBlueprintを開きます。
■実装箇条書き
・イベントグラフを開き、右クリックを押してリストからBeginPlayイベントを選択してノードを追加します。
・イベントグラフを右クリックして、GetAllActorsOfClassを選択してノードを追加します。
・GetAllActorsOfClassのActorClassにRecast Nav Meshを選択して、OutActorsからGetノードを追加し、その結果を変数へ昇格します。
GetAllActorsOfClassを何度も呼ぶと、コストが高いため最初の1回だけ呼ぶようにします。
・イベントグラフを開き、右クリックを押してリストからTickイベントを選択してノードを追加します。
・左側にあるマイブループリントの変数から、先ほど作ったNavmeshの変数を呼び出します。
・Navmeshの変数からノードを伸ばし、リストの中から「GetRandomPointInNavigableRadius」のノードを追加します。
・イベントグラフを開き、右クリックを押してリストからGetActorLocationノードを追加して、ReturnValueからGetRandomPointInNavigableRadiusのOriginノードへ繋ぎます。
・GetRandomPointInNavigableRadiusのReturnValueからノードを伸ばして、ブランチノードを追加します。
・ブランチノードとTickイベントのノードを繋ぎ、下記画像のようにセットしてください。
処理の説明ですが、Tick処理なので毎フレームプレイヤーが操作しているキャラクターがナビゲーションメッシュの範囲外かどうか確認しています。
範囲外に出ている場合は、一つ前の位置を適用して、戻しています。
ジャンプを行う場合は、空中で止まるといった挙動となってしまうためジャンプを許可するゲームデザインの場合は工夫が必要になります。
実行した動画になります。
まとめ
今回ご紹介した方法を使うと、レベル上に沢山のActorを置くことなく素早くゲームの確認ができます。他にも良い点としては、NPCや敵AIと同じ場所しか動けなくなるためデバックや安全地帯に対する対策としても良いと思います。
ジャンプを含めたゲームデザインを行うゲームでは操作性を損なう可能性があるので注意が必要です。