PavilionDV7の雑多なやつ

Qiitaから移行しました。UE4に関する記事から興味のあることまで色々書きます。

【UE4】Influence Map 再び~プロジェクト編~

お知らせ

  • 2020-12-21

    • Influence Mapシステムをプラグイン化したプロジェクトを「プロジェクトのダウンロード」に追加
  • 2021-01-17

    • プラグイン化プロジェクトの方でInfluence MapシステムをEQSでも使えるように変更

はじめに

Unreal Engine 4 (UE4) Advent Calendar 2020 16日目の記事です。

2017年にQiitaにて【UE4】EQSを使ってInfluence Mapを作ったという記事を書きました。内容はEQSを使って鬼エージェントのInfluence Mapを作成しNav Modifier Volumeを使って鬼エージェントを避けるようなナビゲーションを実行するというものです。

3年前の記事ですが嬉しいことに2020年になってもちょくちょく「いいね(LGTM)」を付けていただけていますし、「Influence Map」とググってみると自分の記事が上から2番目に表示されるようになっていました。いずれも記事に興味を持ってくださった方、読んでくださった方のおかげです。ありがとうございます。

しかし先の記事で紹介した手法はブループリントのみで解決するのでお手軽です。しかしInfluence Mapの強みである戦術的な位置決定を提供できたかと言われるとそうではないと思っています。はっきり言ってしまえばInfluence Mapシステムとしては中途半端なものでした。

今年のアドカレは、前回のInfluence Mapシステムでの反省を元に機能強化/拡張を目指して、1から作り直したInfluence Mapシステムを紹介します。


ソースコードの例示も含めるとかなりの量になってしまったので「プロジェクト編」と「プログラム編」の2つに分けて記事を投稿しています。

プロジェクト編(現在見ている記事)では

  • Influence Mapの仕組み
  • サンプルレベルの紹介
  • セットアップの手順

の3つを紹介します。Influence Mapシステムの詳細については「プログラム編」にて紹介していますので興味のある方は是非呼んでみてください。

Influence Map

ナビゲーションAIに属すると思われる技術の1つであり*1、エージェントの戦術的な位置決定を支援するために用いられます。あくまでも支援であり実際に「ここに行け」「向こうに行け」といった指示を出すことはなく、位置決定に必要なデータを収集して提供するだけです。

Influence Mapが持つ有利な点として「全てのエージェントが持つ潜在的な知識/情報を表現できる」ところにあります。例えば「どれくらいの攻撃範囲を持つか」「どこを探索したか(またはしていないか)」。こういった情報は「チームAのエージェントごとの攻撃範囲マップ」「チームBのエージェントごとの攻撃範囲マップ」といった具合に、敵/味方それぞれで共通の知識として一度計算して保持することで、各エージェントはそれぞれで冗長なベクトル計算を行うことなく一発で必要なデータを取り出す事ができます。

さらなる利点としてInfluence Mapは上で挙げたように「チームごとに共通する情報」を保持することも出来るため、例えば「現在味方が攻撃している敵」や「味方が集まっている場所」といったチームメイトを考慮した位置決定をするのにも役立てることが出来ます。「誰を攻撃するか」「どこに逃げるべきか」といった個人的な位置決定から、「味方が攻撃していない敵はどこにいるか」「敵/味方が拮抗している場所はどこか」といったチームを意識した位置決定が可能になることで創発的な集団行動を得る事ができます。

影響

Influence Mapは「エージェントは環境(空間)に対して何らかの影響を発している」というアイディアに基づいています。 「何らかの影響」というのは代表的には以下のものが挙げられます。

  • 攻撃範囲
  • 視野範囲
  • 移動速度
  • 移動経路

もちろん影響が持つ意味というのは最終的にはAIデザイナーが決定するものであるため、ここにあるのはほんの一部です。

これらを駆使することで次のような問いに答えることが出来ます。

  • 味方との間隔を維持する場所はどこか?
  • 安全な退避場所はどこか?
  • 特に敵が密集している地点はどこか?
  • 敵と味方が拮抗している場所(前線)はどこか?
  • 味方が攻撃していない敵はどれか?

挙げた問題はベクトル計算で答えることもできますが、Influence Mapを利用することでベクトル計算は全てスキップし、なおかつ集団を意識した位置決定をすることが出来ます。


Influence Mapは一般的にグリッドによって空間分割し、各セルに対して影響値を保存していきます。影響値はエージェントから発せられる影響を周囲のセルに伝播することによって決定されます。このとき伝播されたセルの影響値は「危険度」「価値」といった何らかの意味を持ちます。

一般的に伝播はエージェントを中心として放射状に伝えられます。影響値の大きさはエージェントからの距離によって決定され、エージェントが立っているセルは最大の「1.0」の影響値を持ち、伝播する最大距離にあるセル以降では最小の「0.0」の影響値が保存されます。

f:id:PavilionDV7:20201214125142p:plain

この影響値はエージェントごとに独立したものではなく、複数のエージェントが狭いエリアに配置されたとき、伝播された影響値は加算され複合的な影響が作成されます。このとき各セルの影響値は0.0 ~ 1.0の範囲を超える値を示します。エージェントは各セルの影響値を見ることで複合的な要素を考慮した位置決定を実行することが出来ます。

f:id:PavilionDV7:20201214125300p:plain

影響値は一般的に正の値で扱われますが反転させることも可能です。つまり0.0 ~ 1.0を-1.0 ~ 0.0の範囲へと変換します。Influence Mapを反転させることによって味方エージェントのInfluence Mapは正の影響、敵エージェントのInfluence Mapは負の影響を持つとみなすことが出来るのです。

f:id:PavilionDV7:20201214125309p:plain

伝播

先に述べたように影響は伝播と呼ばれる仕組みによってInfluence Mapにマッピングされます。(マッピングされた値は影響値と呼ばれます) 一般的に影響はエージェントを中心として放射状に伝播し、各影響値はエージェントからの距離に応じて次に示す式によって決定されます。

\displaystyle{
\text { Influence }=\text { MaxValue }-\left(\text { MaxValue } \times \frac{\text { Distance }}{\text { MaxDistance }}\right)
}

上で示した式は線形な変化を示しますが、必ずしも線形である必要はありません。指数を追加して曲線にすることも可能です。

\displaystyle{
\text { Influence }=\text { MaxValue }-\left(\text { MaxValue } \times \frac{\text { Distance }}{\text { MaxDistance }}\right)^X
}

曲線が扱えることによって影響が持つ意味をより強調することが出来ます。例えば戦車といった砲台を持つ兵器は砲撃の射程距離内であれば全てが危険なエリアです。しかし戦車に近づけば近づくほど砲撃による危険度は下がっていきます。 こういった単純な線形では表現出来ない伝播を曲線を駆使することによって、よりエージェントの役割に沿った伝播を実行することが出来ます。


上で紹介した式は全て障害物の無い環境での動作を前提としています。しかし障害物のない環境のゲームというのはほとんど無いと言ってもいいでしょう。多くは視線を遮るような何らかの障害物が多く配置されているはずです。

そのような場合は異なる伝播方法を探す必要があります。例えば視線に基づいた伝播を必要としている場合は単純に見えない場所には伝播させない(視線チェックに失敗したセルには0.0の影響値をセット)だけで十分にそれらしい伝播を実現できます。

もしも移動を伴った脅威を伝播で表現する必要がある場合は「チェックに失敗したところは無視する」という方法では十分な成果が得られないこともあります。移動を伴った脅威というのは「敵はテーブルを挟んで向こうにいるため、こちらへ移動するのに5秒かかる」といったものです。このような「移動に5秒かかる敵の脅威」をうまく伝播で表現するには経路探索データを使うことで解決出来ます。エージェントから敵への経路探索結果から経路長をMaxDistance、経路として通る各セルごとの距離をDistanceとすれば、うまいこと表現出来ます。

ただし経路探索は軽い処理ではありません。ナビゲーションデータがグリッドベースであろうとナビメッシュベースであろうと経路探索処理は負荷がかかります。ですがInfluence Mapは静的なデータとして事前にマップに焼き込むことが出来ます。このときに各セルから各セルへの経路探索データを保持させ、必要な情報は表を参照するだけで影響値を求めることが出来ます。

プロジェクトのダウンロード

いつもの通りOneDriveにてプロジェクトを配布しています。

エンジンバージョン:UE4.25.4

https://1drv.ms/u/s!Au-8FqgREBKZjQ-yQTgaqBBB5K5k?e=oxkjek

フォルダ名が「IMapPluginExample」となっていますが、これは構想時点ではプラグイン化した状態で配布をするつもりだった頃の名残です。うだうだしていたせいで残念ながら記事公開までには間に合いませんでした。

自分の勉強も兼ねて近い将来はプラグイン化して配布する予定です。その時はTwitterにてお知らせします。

PavilionDV7 (@Dv7Pavilion) | Twitter


プラグイン化したInfluence Mapシステムを含む、サンプルプロジェクトを追加しました。

https://1drv.ms/u/s!Au-8FqgREBKZjRJhN191fYnkoHv9?e=vumuzk

任意のプロジェクトへのインストール方法

  1. 上のURLからIMapPluginプラグインを含むサンプルプロジェクトをダウンロードする
  2. プロジェクトを作成する
  3. .uprojectがあるフォルダ内に「Plugins」フォルダを作成する
  4. 3番で作成したPluginsフォルダ内に「IMapPlugin」フォルダをコピーする
  5. プロジェクトを開き「Edit -> Plugins」を選択
  6. 開いたウィンドウの左の欄にある中から「Project/Other」を選択し、右の欄から「IMapPlugin」を有効化する

プロジェクト

Influence Mapシステムの実装Dave Mark氏による「Modular Tactical Influence Maps」を参考にしました。

Dave Mark氏のアーキテクチャをベースにしつつブループリントとの親和性を高めるためのいくつかの機能追加をしています。

「はじめに」でも書きましたがシステムそのものの詳細については「プログラム編」にて紹介します。ここでは今回用意したサンプルプロジェクトの内容説明とセットアップ手順を紹介します。

サンプルマップについて

各サンプルマップでは伝播やInfluence Mapを利用した様々な位置検索、Influence Mapを利用した経路探索の様子をお見せしています。

Propagation_P

f:id:PavilionDV7:20201213233736p:plain

  • 内容

Influence Mapシステムが実装する伝播の様子を見ることが出来るサンプルです。

Influence Mapシステムは次の3つの伝播を実装しています。

  • 放射状に広がる伝播
  • 視野状に広がる伝播
  • Float Curveを利用した伝播

放射状に広がる伝播は先の「伝播」の項目で説明したものと同様です。ただし高機能版となっており伝播の際に各ノードに対して視線チェックを実行し、失敗したノードについては中心から失敗したノードまでに必要なステップ数を元に影響値を決定しています。壁なしの伝播と壁ありの伝播で最終的な影響値が異なることが確認できます。 これは経路探索データを利用した影響値の決定の簡易版です。

視野状に広がる伝播は放射状に広がる伝播にフィルタリング関数を加えたものになります。フィルタリング関数の中身は至って単純で、パラメータとして渡されるエージェントの視野角、視野範囲、パーソナルスペースから内積を利用した視野内チェックを実行し、条件を満たさなかったノードを除外します。ステルスアクションといった敵の視野情報が重要な要素となるジャンルで有利に働きます。

Float Curveを利用した伝播は「伝播」の項目で説明した「指数を加えた伝播式」と同等の表現を簡単に実現するためのものです。Float Curveは任意のグラフを描くことが出来るため実装した伝播方法の中で最も柔軟で最も扱いやすい伝播方法だと思います。ここで利用しているFoat CurveはExamples/1_Propagationフォルダにある「Normal_Propagation_Curve」アセットです。好きな形に変更して伝播の変化を見てみることをおすすめします。

WorkingMap_P

f:id:PavilionDV7:20201219185231p:plain

  • 内容

複数のInfluence Mapから任意のデータを作り出すための演算の使い方を見ることが出来るサンプルです。

Influence Mapはエージェントの影響力を重ね合わせることで目的にあった最適な位置を見つけます。今回作ったInfluence Mapシステムではマップの重ね合わせにWorking Mapと呼ばれる一時的なInfluence Mapを作成します。収集したInfluence Mapは任意の演算処理(加算、乗算、反転、正規化)を通じてWorking Mapへと格納されます。このInfluence Mapを4つの演算を通じて1つのInfluence Mapとして統合することでエージェントは様々なデータを生み出すことが出来ます。

冒頭の画像では青エージェントを「正の影響を伝播するもの」、赤エージェントを「負の影響を伝播するもの」とみなし、それぞれのInfluence Mapを重ね合わせた結果を表示しています。正の影響と負の影響が重なり合う部分は相殺され0.0になっていることがわかります。

Attenuation_P

f:id:PavilionDV7:20201213233649p:plain

  • 内容

時間による影響力の減衰の様子を見ることが出来るサンプルです。

影響力の減衰は距離による減衰を紹介しましたが、更に「時間」による影響力の減衰というのも実装してみました。(正確に言えば時間ではなく「Tick」です)

影響源として機能するために必要なInfluence Propagatorコンポーネントには時間による影響力の減衰率を設定出来ます。1.0を設定すると伝播して次のTickが呼ばれると影響値は0.0になり消滅します。0.1を設定するとTick毎に0.1ずつ影響力が減っていき、10Tick立つと影響力は0.0になります。

これは匂いのような意味を影響力に持たせる場合には特に有用です。エージェントが伝播する影響力はスタック(積み上げ)されるため、同じ場所に居続けるとそのエージェントの周囲の影響値はどんどん高い値を示していきます。これを匂いに例えると「同じ場所に居続けると強く匂いが残ってしまう」ということです。細かく移動を繰り返していればいつしか匂いは薄くなり最終的には全く匂わなくなります。影響力の減衰率はこのような動きを上手くシミュレートすることが出来ます。

CloseTo_P、EvadeFrom_P、CloseEnemyEvadeAlly_P、CloseAllyEvadeEnemy_P、BattleFront_P

画像なし

  • 内容

これら5つのマップは少し複雑なWorking MapによるInfluence Mapの収集&演算の様子を見ることが出来ます。

1つ1つの動きは非常に単純で、中にはInfluence Mapを使わずとも簡単に実現できそうなものもありますが、それらの動きがどのような演算によって導き出されているかチェックしてみることをおすすめします。

Navigation_P_1 f:id:PavilionDV7:20201213233704p:plain

  • 内容

Influence Mapを経路探索時のデータとして利用する様子を見ることが出来るサンプルです。

このInfluence Mapシステムはナビゲーションとも連携を取れるような機能を実装しています。「Move to Location or Actor Use Influence Map Data」という超長い名前のノードを呼び出すと従来のMove to Location...ノードのパラメータに加えて任意のInfluence Mapデータを渡せる「TargetMapData」、TargetMapDataの調整するための「Cost Multiplier」というパラメータを用意しています。

経路探索のコスト計算時に渡されたInfluence Mapデータとコストを求める地点とを照らし合わせ、影響値が高ければ距離に応じたコストに固定の追加コストを加算します。1.0が設定されている地点では固定の追加コストが最大限加算され、0.0が設定されている地点は距離に応じたコストのみが考慮されます。 Cost MultiplierはInfluence Mapによる経路探索時の影響をより強くしたり逆に弱くしたりするために利用することが出来ます。

冒頭の画像では赤エージェントの直線状にある目的地に、赤エージェントが伝播する影響値によって青エージェントが迂回して向かう様子が示されています。

セットアップの手順

ここでは色々実験してみたい方へ向けて、新しくレベルを作ってInfluence Mapシステムを利用するまでのセットアップの手順を紹介していきます。

※自分はエディタの言語設定を英語で使っているためエディタについての単語は適宜読み替えてください。

レベル

1. ナビゲーションメッシュの生成

  1. デフォルトで配置されている床アクターのスケールを大きくする(例:X:5, Y:5, Z:1)

  2. Nav Mesh Bounds Volume をレベルにドラッグ&ドロップ(D&D)する Setup_1 f:id:PavilionDV7:20201213233742p:plain

  3. Nav Mesh Bounds Volume のサイズをレベルを覆う程度に広げる

  4. World Outlinerにある「RecastNavMesh」アクターを選択し、Detailsにある項目から「TIle Size UU」を見つけ、設定されている数値を下限まで下げる(下限は560.0)

    Setup_2 f:id:PavilionDV7:20201213233753p:plain

2. ノードグラフの生成

  1. Place Actorsの検索欄に「node graph」と打ち込み、ハイライトされたアクターをレベルにD&Dする

    Setup_3 f:id:PavilionDV7:20201213233756p:plain

  2. 5番でD&Dしたアクターを選択しDetailsにある項目の中から「Clear Node Graph」「Generate Node Graph」の順番でラジオボタンを押す

    Setup_4 f:id:PavilionDV7:20201213233802p:plain

  3. World OutlinerにNodesフォルダが追加されNodesフォルダ以下に大量のInfluence Nodeアクターが表示されているか確認

    Setup_5 f:id:PavilionDV7:20201213233805p:plain

3. Influence Mapデータの生成

  1. Place Actorsの検索欄に「map collection」と打ち込み、ハイライトされたアクターをレベルにD&Dする(画像略)

  2. Detailsの中にある項目から「Construct Influence Map Data」の+ボタンをクリックし項目を追加。生成するInfluence Mapの名前を入力する。(ここでは「Proximity(近接)」とする)

  3. Construct Influence Mapsのラジオボタンを押す。

  4. World OutlinerにInfluence Mapフォルダが追加され以下に「入力した名前 + Influence Map」という名前のアクターがあるか確認

コンポーネント

1. キャラクターBPの作成

ここの手順は省略

もしCylinderやCone、Cubeでボディメッシュを作る場合はCollision Presetsを「Character Mesh」に変更しておく

2. Influence Propagatorコンポーネントを追加する

  1. Add Componentsのボタンを押し、検索欄に「Influence」と入力。2つ候補があるが、ここでは上の「Influence Propagator」を選択する
  2. 1番で追加したコンポーネントを選択し、Detailsにある各項目を画像の通りに設定する
    1. Setup_8 f:id:PavilionDV7:20201213233808p:plain

レベル再び

1. 作成したキャラクターをレベルにD&Dする

2. プレイする

D&Dしたキャラクターの伝播の様子が表示される。

Move to Location or Actor Use Influence Map Dataノードを使うとき

Influence Mapデータを経路探索時に利用できるようにするために、このプロジェクトではRecast Navmeshクラスを継承しカスタマイズした「Influence Recast Navmeshクラス」をナビメッシュデータとして設定する必要があります。

  1. Project Settingsを開き、左側の欄から「Navigation System」を探し、クリックする
  2. Navigation Systemの項目から「Supported Agents」を探し、展開、「Nav Data Class」の項目を「Influence Recast Navmesh」に変更する。(自動的にPreffered Nav Dataも変更されるはず)

f:id:PavilionDV7:20201213235601p:plain

  1. レベルに配置したNav Mesh Bounds Volumeを1目盛り動かしてナビゲーションメッシュを再生成する
  2. 「セットアップの手順 - レベル」にて紹介した手順を再度実行する
  3. プレイする

設定可能なプロパティ

Influence Map Collectionアクター

f:id:PavilionDV7:20201214130043p:plain

  • Construct Influence Map Data

ここにはマッピングする影響の名前を設定します。

このInfluence Mapシステムでは意味毎にInfluence Mapを用意する方法を採用しています。ここでの意味とは攻撃範囲や移動可能範囲、脅威、安全といったものです。攻撃範囲についての影響をマッピングしたい場合はConstruct Influence Map Dataに追加した項目に近しい意味である「Proximity」を入力します。脅威であれば「Threat」となります。

  • Constrcut Influence Maps

このラジオボタンを押すと「Construct Influence Map Dataで入力した名前 + Influence Map」というアクターが生成されます。

名前 + Influence Mapアクター

f:id:PavilionDV7:20201214131928p:plain

  • Tick Enabled

有効の場合、このInfluence Mapに登録されているPropagatorを更新します。

  • Tick Interval

このInfluence Mapの更新間隔です。Influence Mapは毎フレーム更新する必要はなく大体0.5秒 ~ 2.0秒間隔で更新すれば十分に新鮮なデータを得ることが出来ます。この更新間隔についてはInfluence Mapを利用するエージェント、もしくはゲームジャンルによって変化します。

Influence Propagatorコンポーネント

f:id:PavilionDV7:20201214133608p:plain

  • Target Map Name

このPropagatorが発する影響の意味を入力します。これはInfluence Map CollectionアクターのConstruct Influence Map Dataに入力した内容とリンクします。画像のようにTarget Map Nameに「Proximity」を入力した場合、Propagatorはレベルにある「Proiximity Influence Map」を探し自身を登録します。

  • Tick Enabled

影響の伝播処理を実行するか否かを設定します。基本的にこれはTRUEのままでOKです。

  • Propagator Range

伝播範囲を設定します。

  • Attenuation Ratio

影響力の減衰率を設定します。

  • Team

エージェントが所属するチームを決定します。チームと言っていますが村人、盗賊、騎士といった役割/立場と考えてもらってもOKです。

これはWorking Mapでの演算の際に「味方チームは正の影響」「敵チームは負の影響」という判別をしやすくするためのものです。

  • Ally Team

味方とみなすチームを設定します。

ここに設定されたチームは正の影響を発するものとして扱います。

  • Enemy Team

敵とみなすチームを設定します。

ここに設定されたチームは負の影響を発するものとして扱います。

  • Propagation Curve

伝播時の影響の分布を定義したカーブアセットを設定します。

セットされていない場合は標準的な線形の伝播を使用します。

Influence Propagator Vision Coneコンポーネント

f:id:PavilionDV7:20201214135238p:plain

無条件で「視野内にある」と判断するための範囲を設定します。

Personal Space内にあるノードはたとえ背後にあろうと「視野内にある」として処理します。

  • View Range

視野距離を設定します。基本的には「View Range <= Propagate Range」の範囲に収めることを推奨します。 View RangeをPropagate Rangeを超える範囲に設定してもPropagate Rangeにクランプされます。

  • View Angle

視野角を設定します。90のときは左右90度の範囲に限定します。180は左右180度(つまり全て)の範囲に限定します。

諸注意

Influence Mapの解像度

このプロジェクトではInfluence Mapの生成する際にノードグラフのデータを利用します。そのノードグラフはナビメッシュデータを利用して生成されています。よって「Influence Mapの解像度 = ノードグラフの解像度」となります。

現状Tile Size UUは560.0が下限なので、これ以上細かくすることは出来ません。

デバッグ表示について

デバッグ表示の方法は3通りあります

  1. 生成されたInfluence MapアクターのDetailsにある「Draw Debug Influence Map」のチェックボックスにチェックを入れる
  2. Influence Propagatorコンポーネントから「Draw Debug Propagation Map」を呼び出す
  3. Influence Propagatorコンポーネントから「Draw Debug Working Map」を呼び出す

1番はチェックを入れたInfluence Mapに属するInfluence Propagatorの影響値を全て収集し表示します。ただしどのPropagatorが正の影響値を伝播し、負の影響値を伝播するかは区別しません。

2番は呼び出したPropagatorの伝播の様子を表示します。

3番はパラメータに渡されたInfluence Mapをそのまま表示するため、Working Mapを用いたInfluence Mapの演算を渡すことで最も柔軟にデバッグ表示が出来ます。

おわりに

プログラム編に続きます。

参考資料

The Core Mechanics of Influence Mapping

The Core Mechanics of Influence Mapping - Video

Spatial Knowledge Representation through Modular Scalable Influence Maps

Modular Influence Map System (Imap)

Escaping the Grid: Infinite-Resolution Influence Mapping, Mike Lewis

Modular Tactical Influence Maps, Dave Mark

Paragon Bots: A Bag of Tricks, Mieszko Zieliński

追記 : Influence MapシステムをEQSでも使えるようにしました

これによってInfluence MapシステムがスコアリングしたデータにEQSが持つ距離によるスコアリングや内積を利用したスコアリングを簡単に利用出来るようになりました。

https://1drv.ms/u/s!Au-8FqgREBKZjRJhN191fYnkoHv9?e=vumuzk のContent Browserには新しく「5_EQS_Integration」フォルダが追加されています。

f:id:PavilionDV7:20210117184039p:plain

次の画像のように「Influence Mapジェネレータ」と「IMap Operationテスト」を使うことででEQSでInfluence Mapシステムを利用できます。

f:id:PavilionDV7:20210117184633p:plain

IMap Operationテストはコマンドを積み上げることでInfluence Mapを構築するイメージです。配列の0番目から数字が大きくなる方に順に適用されていきます。IMap Operationテストで公開されるプロパティは通常のブループリントと代わりはありません。

上に張った画像では「前線を求める」Influence Mapを構築していますが、これをブループリントで構築した場合は次のようになります。

f:id:PavilionDV7:20210117185621p:plain

ブループリントにある「Create Interest Map」と「Initialize Working Map」はIMap Operationテストで実行されています。

*1:「Influence MapはナビゲーションAIに属する」と明確に書かれた文が見つからなかったため「思われる」を付けました