Choose your operating system:
Windows
macOS
Linux
概要
Unreal Engine の ナビゲーション システム では、エージェントがパス検索に ナビゲーション メッシュ を使用してレベルをトラバースできます。
動かないオブジェクトを回避するパスの決定はパス検索でできますが、動き回る障害物に対処するには回避アルゴリズムの方が適しています。エージェントが動的な障害物を避けながら移動する回避手法は 2 つあります。対障害物相対速度 (RVO:Reciprocal Velocity Obstacles) と Detour 群衆マネージャー です。
対障害物相対速度 (RVO) システムは、付近のエージェントとの衝突を回避するために各エージェントの速度ベクターを計算します。このシステムでは、付近のエージェントを調査して、それらのエージェントが計算の各タイム ステップにおいて一定速度で移動するものと想定します。選択された最適な速度ベクターは、エージェントにとってターゲットの方向の好ましい速度に最も一致するものです。
Unreal Engine の RVO 実装には、フレーム レート依存関係を削減する最適化が含まれています。また、定数パス再計算を回避するための改善と、潜在的な衝突の解決に役立つ優先順位システムも含まれています。RVO は回避にナビゲーション メッシュを使用しないので、キャラクターのナビゲーション システムとは別に使用できます。このシステムは Character クラスの Character Movement コンポーネントに含まれています。
Detour 群衆マネージャー システムは、アダプティブ RVO サンプリング計算を使用して、エージェント間の回避を処理します。回避処理は、エージェントの方向に対するバイアスを持った、粗くサンプリングされた速度を計算して行います。これにより、従来の RVO 手法よりも回避の質が大きく向上します。また、このシステムでは、可視性とトポロジ パス コリダー最適化を使用して、衝突回避をさらに改善しています。
Detour 群衆マネージャー システムは、サンプリング パターン、エージェントの最大数、エージェントの半径を指定できるオプションがあり、詳細に設定できます。このシステムは DetourCrowd AI Controller クラスに含まれており、任意の Pawn クラスで使用できます。
どちらのシステムも独立して機能します。プロジェクトでは、どちらか一方だけを使用することをお勧めします。
回避手法のおおまかな比較
手法 |
説明 |
制限事項 |
---|---|---|
対障害物相対速度 |
|
|
Detour 群衆マネージャー |
|
|
目標
このガイドでは、相互にやり取りする複数のエージェントの動作を比較して、対障害物相対速度回避手法と Detour 群衆回避手法を使用する方法を説明します。
目的
ターゲットに向かって移動するように ThirdPersonCharacter ブループリントを変更する。
RVO 回避を使用するように Agent ブループリントを変更する。
Detour 群衆回避を使用するように Agent Blueprint を変更する。
1 - 必要な設定
メニューの [New Project Categories (新規プロジェクトカテゴリ)] セクションにある [Games (ゲーム)] を選択して [Next (次へ)] をクリックします。
[Third Person (サードパーソン)] テンプレートを選択し、[Next (次へ)] をクリックします。
[Blueprint (ブループリント)]、[No Starter Content (スターターコンテンツ無し)] オプションの順に選択して、[Create Project (プロジェクト作成)] をクリックします。
このセクションの結果
新規サード パーソン プロジェクトが作成され、Unreal Engine で使用可能な回避手法を学習する準備が整いました。
2 - テスト レベルを作成する
メニューバーで [File (ファイル)] > [New Level (新規レベル)] の順にクリックします。
[Default (デフォルト)] レベルを選択します。
アウトライナ で [Floor] スタティック メッシュ アクタを選択し、[Details (詳細)] パネルで [Scale (拡大・縮小)] を X = 10、Y = 10、Z = 1 に設定します。
[Place Actors (アクタを配置)] パネルに移動し、「Nav Mesh Bounds Volume」を検索します。これをレベルにドラッグして、Floor メッシュ上に配置します。Nav Mesh Bounds Volume の [Scale] を X = 7、Y=10、Z = 1 にします。
[Place Actors (アクタを配置)] パネルに移動し、「Nav Mesh Bounds Volume」を検索します。
これをレベルにドラッグして、Floor メッシュ上に配置します。Nav Mesh Bounds Volume の [Scale] を X = 7、Y=10、Z = 1 にします。
このセクションの結果
このセクションでは、新しいレベルを作成し、ナビゲーション メッシュを追加しました。また、エージェントのターゲットの役割を果たす 2 つのスフィア アクタを追加しました。
3 - エージェントを作成する
コンテンツ ブラウザ で右クリックし、 [New Folder (新規フォルダ)] を選択して新しいフォルダを作成します。このフォルダに「 NavigationSystem 」という名前を付けます
コンテンツ ブラウザ で、 「ThirdPersonBP」>「Blueprints」 の順に移動し、 [ThirdPersonCharacter] ブループリントを選択します。これを「 NavigationSystem 」フォルダにドラッグし、 [Copy Here (ここにコピー)] オプションを選択します。
「NavigationSystem」フォルダに移動して、ブループリントの名前を「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 つ作成します。それらのエージェントの前に、ターゲットとして スフィア を配置します。
[Simulate (シミュレート)] をクリックして、エージェントがゴールに向かって移動するのを観察します。回避を設定しないとレベルの中央でどのように衝突が発生するのかに注目します。
このセクションの結果
このセクションでは、回避を使用せずにゴールに向かって移動するエージェントを作成しました。
4 - エージェントに対障害物相対速度回避を追加する
コンテンツ ブラウザ で、[BP_NPC_NoAvoidance] ブループリントを右クリックして、[Duplicate (複製)] をクリックします。新しいブループリントに「BP_NPC_RVO」という名前を付けます。
[BP_NPC_RVO] ブループリントをダブルクリックして、ブループリント エディタで開きます。[Character Movement] コンポーネントを選択し、[Details] パネルで [Character Movement: Avoidance (キャラクタームーブメント:回避)] セクションに移動します。
[Use RVOAvoidance (RVO 回避を使用)] チェックボックスをオンにして、[Avoidance Consideration Radius (回避考慮半径)] を 100 に設定します。
ブループリント を コンパイル して 保存 します。これで、エージェントで対障害物相対速度回避が有効になりました。
いくつかの [BP_NPC_RVO] ブループリントをレベルにドラッグし、以前と同じ設定に従います。[Simulate] をクリックして結果を確認します。
このセクションの結果
このセクションでは、エージェントに対障害物相対速度回避を追加する方法を学習しました。
5 - エージェントに Detour 群衆回避を追加する
コンテンツ ブラウザ で、[BP_NPC_NoAvoidance] ブループリントを右クリックして、[Duplicate (複製)] をクリックします。新しいブループリントに「BP_NPC_DetourCrowd」と名前を付けます。
[BP_NPC_DetourCrowd] ブループリントをダブルクリックして開きます。[Details] パネルに移動して「AI Controller」を検索します。
[AI Controller Class (AI コントローラー クラス)] の隣のドロップダウンをクリックして、[DetourCrowdAIController] を選択します。
ブループリントを コンパイル して 保存 します。エージェントで Detour 群衆回避が有効になりました。
いくつかの BP_NPC_DetourCrowd ブループリントをレベルにドラッグし、以前と同じ設定に従います。[Simulate] をクリックして結果を確認します。
Detour 群衆マネージャー 設定の調整は、[Settings (設定)] > [Project Settings (プロジェクト設定)] で [Crowd Manager (クラウド マネージャー)] セクションに移動して行うことができます。
このセクションでは、Detour 群衆マネージャー システムのいくつかの設定 (システムで使用する [Max Agents (最大エージェント)]、回避計算に使用する [Max Agent Radius (最大エージェント半径)] など) を調整できます。
このセクションの結果
このセクションでは、エージェントに Detour 群衆回避を追加する方法を学習しました。