概要
Unreal Engine の ナビゲーション システム では、エージェントがパス検索に ナビゲーション メッシュ を使用してレベルをトラバースできます。
動かないオブジェクトを回避するパスの決定はパス検索でできますが、動き回る障害物に対処するには回避アルゴリズムの方が適しています。エージェントが動的な障害物を避けながら移動するための回避手法は、Reciprocal Velocity Obstacles (RVO) と Detour Crowd Manager の 2 つがあります。
RVO システムは、付近のエージェントとの衝突を回避するために各エージェントの速度ベクターを計算します。このシステムでは、付近のエージェントを調査して、それらのエージェントが計算の各タイム ステップにおいて一定速度で移動するものと想定します。選択された最適な速度ベクターは、エージェントにとってターゲットの方向の好ましい速度に最も一致するものです。
Unreal Engine の RVO 実装には、フレーム レート依存関係を削減する最適化が含まれています。また、定数パス再計算を回避するための改善と、潜在的な衝突の解決に役立つ優先順位システムも含まれています。RVO は回避にナビゲーション メッシュを使用しないので、キャラクターのナビゲーション システムとは別に使用できます。このシステムは Character クラスの Character Movement コンポーネントに含まれています。
Detour Crowd Manager システムは、アダプティブ RVO サンプリング計算を使用して、エージェント間の回避を処理します。回避処理は、エージェントの方向に対するバイアスを持った、粗くサンプリングされた速度を計算して行います。これにより、従来の RVO 手法よりも回避の質が大きく向上します。また、このシステムでは、可視性とトポロジ パス コリダー最適化を使用して、衝突回避をさらに改善しています。
Detour Crowd Manager システムは、サンプリング パターン、エージェントの最大数、エージェントの半径を指定できるオプションがあり、詳細に設定できます。このシステムは DetourCrowd AI Controller クラスに含まれており、任意の Pawn クラスで使用できます。
どちらのシステムも独立して機能します。プロジェクトでは、どちらか一方だけを使用することをお勧めします。
回避手法のおおまかな比較
手法 | 説明 | 制限事項 |
---|---|---|
RVO |
|
|
Detour Crowd Manager |
|
|
目標
このガイドでは、相互にやり取りする複数のエージェントの動作を比較して、RVO と Detour Crowd Manager による回避方法を使用する方法を説明します。
目的
-
ターゲットに向かって移動するように ThirdPersonCharacter ブループリントを変更する。
-
RVO による回避を使用するように Agent ブループリントを変更する。
-
Crowd Detour 回避を使用するように Agent Blueprint を変更する。
1 - 必要な設定
-
メニューの [New Project Categories (新規プロジェクトカテゴリ)] セクションにある [Games (ゲーム)] > [Third Person (サードパーソン)]** テンプレートを選択します。
-
[Third Person (サードパーソン)] テンプレートを選択し、[Next (次へ)] をクリックします。
このセクションの結果
新規サード パーソン プロジェクトが作成され、Unreal Engine で使用可能な回避手法を学習する準備が整いました。
2 - テスト レベルを作成する
-
メニューバーで [File] > [New File...] の順にクリックします。
-
[Default] レベルを選択します。
-
アウトライナ で [Floor] スタティック メッシュ アクタを選択し、[Details (詳細)] パネルで [Scale (拡大・縮小)] を X = 10、Y = 10、Z = 1 に設定します。
-
[Place Actors (アクタを配置)] パネルに移動し、「NavMeshBoundsVolume」を検索します。これをレベルにドラッグして、Floor メッシュ上に配置します。NavMeshBoundsVolume の [Scale] を X = 7、Y=10、Z = 1 にします。
-
[Place Actors (アクタを配置)] パネルに移動し、[Shapes] カテゴリから Sphere アクタをレベルにドラッグします。
このセクションの結果
このセクションでは、新しいレベルを作成し、ナビゲーション メッシュを追加しました。また、エージェントのターゲットの役割を果たす 2 つのスフィア アクタを追加しました。
3 - エージェントを作成する
-
コンテンツ ドロワー で [New Folder (新規フォルダ)] を選択して新規フォルダを作成します。このフォルダに「Avoidance」という名前を付けます
-
コンテンツ ドロワー で、「TThirdPerson」>「Blueprints」 の順に移動し、[BP_ThirdPersonCharacter] ブループリントを選択します。これを「Avoidance」フォルダにドラッグし、 [Copy Here (ここにコピー)] オプションを選択します。
-
「Avoidance」フォルダに移動して、ブループリントの名前を「BP_NPC_NoAvoidance」に変更します。ブループリントをダブルクリックして開き、イベント グラフ に移動します。入力ノードをすべて選択して削除します。
-
イベント グラフ を右クリックし、「Add Custom Event」を検索、選択します。イベントに「MoveNPC」という名前を付けます。
-
[My Blueprint (マイ ブループリント)] パネルに移動し [Variables (変数)] の隣の 追加 (+) ボタン をクリックして新しい変数を作成します。変数に「Target」という名前を付けます。
-
[Details] パネルに移動し、[Variable Type (変数の型)] ドロップダウンをクリックします。「Actor」を検索して、[Object Reference (オブジェクト参照)] を選択します。[Instance Editable (インスタンス編集可能)] チェックボックスをオンにします。
-
Target 変数を** イベント グラフ にドラッグし、[Get Target (Target を取得)] を選択します。以下のように、Target ノードからドラッグして「Is Valid**」マクロを検索、選択します。
-
イベント グラフ を右クリックし、「Get reference to self」を検索して選択します。
-
イベント グラフ を右クリックし、「AI Move To」を検索、選択します。
-
Is Valid ノードの Is Valid ピンを AIMoveTo ノードに接続します。Self ノードを AIMoveTo ノードの Pawn ピンに接続します。Target 変数をドラッグして、AIMoveTo ノードの Target Actor ピンに接続します。
- イベント グラフ を右クリックし、「Event Begin Play」を検索して選択します。Event Begin Play ノードからドラッグして、「MoveNPC」を検索、選択します。
-
ブループリントを コンパイル して、保存 します。完成したブループリントは、次の画像のようになります。
-
BP_NPC_NoAvoidance ブループリントをレベルにドラッグし、[Details] パネルで、[Target] の隣のドロップダウンをクリックし、エージェントの前にある Sphere アクタを検索して選択します。
-
以下のように BP_NPC_NoAvoidance ブループリントを複製します。
-
最後の 2 つの手順を繰り返し、レベルの反対側にエージェントのグループをもう 1 つ作成します。それらのエージェントの前に、ターゲットとして Sphere を配置します。
-
[Simulate (シミュレート)] をクリックして、エージェントがゴールに向かって移動するのを観察します。回避を設定しないとレベルの中央でどのように衝突が発生するのかに注目します。
このセクションの結果
このセクションでは、回避を使用せずにゴールに向かって移動するエージェントを作成しました。
4 - エージェントにRVO回避を追加する
-
コンテンツ ドロワー で、[BP_NPC_NoAvoidance] ブループリントを右クリックして、[Duplicate (複製)] をクリックします。新しいブループリントに「BP_NPC_RVO」という名前を付けます。
-
[BP_NPC_RVO] ブループリントをダブルクリックして、ブループリント エディタで開きます。[Character Movement] コンポーネントを選択し、[Details] パネルで [Character Movement: Avoidance (キャラクタームーブメント:回避)] セクションに移動します。
-
[Use RVOAvoidance (RVO 回避を使用)] チェックボックスをオンにして、[Avoidance Consideration Radius (回避考慮半径)] を 100 に設定します。
-
ブループリント を コンパイル して 保存 します。これで、エージェントで RVO 回避が有効になりました。
-
いくつかの [BP_NPC_RVO] ブループリントをレベルにドラッグし、以前と同じ設定に従います。[Simulate] をクリックして結果を確認します。
このセクションの結果
このセクションでは、エージェントに RVO 回避を追加する方法を学習しました。
5 - エージェントに Crowd Detour 回避を追加する
-
コンテンツ ドロワー で、[BP_NPC_NoAvoidance] ブループリントを右クリックして、[Duplicate (複製)] をクリックします。新しいブループリントに「BP_NPC_DetourCrowd」と名前を付けます。
-
[BP_NPC_DetourCrowd] ブループリントをダブルクリックして開きます。[Details] パネルに移動して「AI Controller」を検索します。
-
[AI Controller Class (AI コントローラー クラス)] の隣のドロップダウンをクリックして、[DetourCrowdAIController] を選択します。
-
ブループリントを コンパイル して 保存 します。エージェントで Crowd Detour 回避が有効になりました。
-
いくつかの BP_NPC_DetourCrowd ブループリントをレベルにドラッグし、以前と同じ設定に従います。[Simulate] をクリックして結果を確認します。
-
Detour Crowd Manager 設定の調整は、[Settings (設定)] > [Project Settings (プロジェクト設定)] で [Crowd Manager] セクションに移動して行うことができます。
-
このセクションでは、Detour Crowd Manager システムのいくつかの設定 (システムで使用する [Max Agents (最大エージェント)]、回避計算に使用する [Max Agent Radius (最大エージェント半径)] など) を調整できます。
このセクションの結果
このセクションでは、エージェントに Crowd Detour 回避を追加する方法を学習しました。