概要
Unreal Engine の「ナビゲーションシステム」 は、人工知能エージェントにパスファインディング機能を提供します。
スタート位置から目的地までのパス検索を可能にするために、ワールドのコリジョン ジオメトリからナビゲーション メッシュが生成されます。この簡素化されたポリゴン メッシュは、レベル内の移動可能な空間を表します。ナビゲーション メッシュのローカライズされた部分を再ビルドできるよう、デフォルト設定によってナビゲーション メッシュはタイルに細分化されます。
最終的なメッシュはポリゴンで構成され、各ポリゴンにはコストが関連付けられます。パス検索アルゴリズムでは、パスを検索しながら、目的地までのコストが最も小さい最適なパスを発見しようと試みます。
このシステムには、具体的なニーズに基づいてエージェントのナビゲーション動作をカスタマイズできるさまざまな機能が用意されています。
目標
このクイック スタート ガイドでは、ナビゲーション システムを使用してレベル内を歩き回る単純なエージェントを作成する方法を学習します。
目的
-
レベルでナビゲーション メッシュ アクタを使用してナビゲーションをビルドする。
-
レベルでナビゲーション メッシュを視覚化し、ニーズに合わせて調整する方法を学習する。
-
ナビゲーション システムを使用してレベル内を歩き回るように ThirdPersonCharacter ブループリントを変更する。
1 - 必要な設定
-
Unreal プロジェクト ブラウザの [New Project Categories (新規プロジェクト カテゴリ)] セクションにある [Games (ゲーム)] を選択し、 Third Person (サードパーソン) テンプレートを選択します。
-
[Blueprint (ブループリント)] と [No Starter Content (スターター コンテンツなし)] オプションを選択し、[Create] をクリックします。
このセクションの結果
新規のサードパーソン プロジェクトを作成し、ナビゲーション システムについて学ぶ準備ができました。
2 - ナビゲーション メッシュを作成する
このセクションでは、ナビゲーション メッシュ バウンズ ボリューム を使用して、レベル内のナビゲーションを生成する必要のある領域を指定します。この情報を使用して、エージェントがレベル内を目的地に向かって移動します。
-
プロジェクトのデフォルトの ThirdPersonExampleMap で、 [Place Actors (アクタの配置)] パネルに移動し、「NavMeshBoundsVolume (ナビ メッシュ バウンズ ボリューム)」 を検索してレベルにドラッグします。
-
その [NavMeshBoundsVolume] を選択して、[Details (詳細)] パネルに移動し、[Scale (拡大・縮小)] を X = 20、Y= 20、Z = 5 に設定します。以下のように、ボリュームを移動させてプレイ領域全体を覆うようにします。
-
[Outliner (アウトライナ)] ウィンドウで [ThirdPersonCharacter] ブループリントを選択し、レベルから削除します。
-
キーボードで P キー を押して、レベル内のナビゲーション メッシュを視覚化します。以下の画像のように、ナビゲーション メッシュはデフォルトで緑色で視覚化されます。
Unreal Engine では、ナビ メッシュ バウンズ ボリューム アクタがレベルに追加されるか、サイズ変更されるとすぐに、ナビゲーション メッシュが自動生成されます。
-
このナビゲーション メッシュで階段上にビジュアル アーティファクトが含まれている様子に着目してください。これが発生するのは、ナビゲーション メッシュはレベル内のコリジョンを簡素化して表わしたものだからです。[World Outliner] ウィンドウで [RecastNavMesh-Default] を選択し、[Details] パネルに移動します。[Display (表示)] セクションに移動し、[Draw Offset (オフセットを描画)] の値を 50 に設定します。これにより、ナビゲーション メッシュが描画される高さのオフセットが調整され、見やすくなります。
このセクションの結果
このセクションでは、ナビ メッシュ バウンズ ボリューム アクタをレベルに追加し、プレイ領域にフィットするようにサイズを変更しました。また、P キーを押して、最終的なナビゲーション メッシュを視覚化する方法を学びました。
3 - ナビゲーション メッシュを視覚化する
このセクションでは、さまざまなナビゲーション メッシュ設定の変更方法と、レベル内のメッシュの視覚化方法の変更方法を学習します。
-
[Outliner] に移動し、[RecastNavMesh-Default] アクタを選択します。
-
アクタを選択した状態で、 [Details] パネルに移動し、[Display] セクションまで下にスクロールします。ここに、生成したナビゲーション メッシュを見やすく視覚化するためのさまざまなオプションがそろっています。以下の例では、[Draw Poly Edges (ポリゴンのエッジを描画)] を選択して、メッシュを構成するポリゴンを表示しました。
-
また、[Draw Tile Bounds (タイルの境界を描画)] チェックボックスをオンにすると、個々のナビゲーション タイルを視覚化できます。
-
ナビゲーション メッシュの生成方法を変更するには、[Generation (生成)] セクションに移動してオプションを変更します。
このセクションの結果
このセクションでは、さまざまなオプションを調整してナビゲーション メッシュの表示設定を変更する方法と、生成方法に影響を与える方法を学習しました。
4 - 最初のエージェントを作成する
このセクションでは、付近の場所をランダムに選択し、そこに移動することでレベル内を歩き回る単純なエージェントを作成します。このエージェントは、目的地に到着したら、数秒待機してからプロセスを繰り返します。
-
コンテンツ ドロワー で [New Folder (新規フォルダ)] を選択して新規フォルダを作成します。このフォルダに「NavigationSystem」という名前を付けます
-
コンテンツ ドロワー で、「ThirdPersonBP」>「Blueprints」 の順に移動し、[BP_ThirdPersonCharacter] ブループリントを選択します。これを「NavigationSystem」フォルダにドラッグし、 [Copy Here (ここにコピー)] オプションを選択します。
-
「NavigationSystem」フォルダに移動して、ブループリントの名前を「BP_NPC_ModNavMesh」に変更します。ブループリントをダブルクリックして開き、イベント グラフ に移動します。入力ノードをすべて選択して削除します。
-
イベント グラフ を右クリックし、「Add Custom Event」を検索、選択します。イベントに「MoveNPC」という名前を付けます。
-
イベント グラフ を右クリックして、「Get Actor Location」を検索、選択します。
-
GetActorLocation ノードからドラッグし、「Get Random Reachable Point In Radius」を検索、選択します。[Radius (半径)]を 1000 ユニットに設定します。
-
GetRandomReachablePointInRadius ノードの Random Location ピンからドラッグして Promote to variable を選択します。
-
MoveNPC ノードを、先ほど作成した RandomLocation ノードに接続します。
-
イベント グラフ を右クリックし、「AI Move To」を検索、選択します。RandomLocation ノードを AI Move To ノードに接続します。
-
イベント グラフ を右クリックして、「Get a reference to self」を検索、選択します。
-
Self ノードを AI Move To ノードの Pawn ピンに接続します。以下のように、 Random Location ノードの 黄色 のピンを AI Move To ノードの Destination ピンに接続します。
-
AI Move To ノードの On Success ピンをドラッグして、「Delay」を検索、選択します。以下のように、このノードの [Duration (期間)] を 4 に設定します。Delay ノードの Completed ピンをドラッグして、「MoveNPC」を検索、選択します。
-
上記の手順を繰り返して、AI Move To ノードの On Fail ピンにノードを追加します。Delay ノードの Duration を 0.1 に設定します。
-
イベント グラフ を右クリックし、「Event Begin Play」を検索して選択します。Event Begin Play ノードからドラッグして、「MoveNPC」を検索、選択します。
-
ブループリントを コンパイル して、保存 します。
-
BP_NPC_NavMesh ブループリントをレベルにドラッグして、[Simulate (シミュレーション)] をクリックします。これで、エージェントがレベル内を歩き回ります。
このセクションの結果
このセクションでは、ナビゲーション メッシュ を使用してレベル内を歩き回る単純なエージェントを作成する方法を学習しました。