0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AIPerceptionとBPでPlayer追跡AIを作成する

Posted at

目的

AIPerceptionの情報は調べればあるものの一つにまとまっているものが無かったので勉強ついでにまとめてみました。
公式のBehaviourTreeのクイックスタートガイドにつぎ足しで作成しているため大部分はそちらを参考にしていただく内容になってます。とりあえず視覚を持ったAIを作りたいだけの方は直接ガイドを参照してください。

対象

  • BPで開発をしていてAIに視覚、聴覚を簡単に持たせたい方
  • BehaviourTreeの基本的な知識がある方
  • AIPerceptionを少し理解して使いたい方

バージョン

UnrealEngine 5.3.2

最初に

最初にどのようなAIを作っているか動画で見たほうが分かりやすいと思うので完成形を載せておきます。

AIPerceptionとは

大概AIControllerにコンポーネントとして実装され、外部から刺激(Stimulus)があった時にイベントを発火します。何も設定しないまま実装した場合、基本的にレベル上にいるポーンを視覚刺激の対象として自動登録し、発見などのイベントを作成することができます。
新たに聴覚などの刺激を与えたい場合はAIPerceptionStimuliSourceコンポーネントを実装したアクタを作成し、刺激を通知するイベントを作成して使用します。
また、ここの刺激については拡張しだいで様々な種類の刺激を作成可能なのですがBPでは現状できません。

AIPerceptionをBPで扱う利点と欠点

明確な利点と欠点があります。事前に言っておくと、特にパフォーマンスにこだわらない場合は十分な機能が扱えます。

利点

  • 計算式を作ることなく視覚の範囲や距離をAIControllerに実装できる
  • 従来のPawnSensingはここ最近ではアップデートが行われてないらしく、今後はAIPerceptionが主流になっていく可能性が高い
  • 視界外になったときも扱える(PawnSensingは検出イベントのみ扱える)

欠点

  • 公式から出ているドキュメントがほとんどない(2024/8月時点)
  • 現在はc++で拡張したクラスを使用することが前提の機能なのでそこまで複雑なことがBPではできない
  • 前二つから、なんとなく公式でやってたからでやっている準備が多い

使い方

前準備

BehaviourTreeの中身

視覚のみを実装したい方は公式のBTを参考にしてください。
今回は聴覚と忘れる処理を使用したいためブランチを追加しています。

聴覚
image.png

忘れたときの処理
image.png

全体
緑→チュートリアルまま
赤→忘れたときの処理
黄色→聴覚
image.png

追加した部分のみ解説します。

  • 聴覚
  1. BlackboardにSoundLocationというVector値を追加します
  2. チュートリアルのHasLineOfSightと同じようにSoundLocationがセットされたときブランチを実行するDecorationを設定
    image.png
  3. 到着後パトロール行動に戻ってほしいのでSoundLocationのKey値をクリアするタスクを作成しておきます(BTT_ClearBBValue)
    image.png
    BlackboardKeyをインスタンス編集可能にし、SoundLocationを指定してください。
  • 忘れたときの処理
  1. BlackboardにStimulusForgottenというBool値を追加します
  2. Decorationを設定します
    image.png
  3. 一定時間後にStimulusForgottenをリセットするタスクを作成し、Waitの後に置いておきます(BTT_ResetStimulusForgotten)

image.png

最適化

プロジェクトファイル下のConfigフォルダ内にあるDefaultGame.iniに以下を入力します。

[/Script/AIModule.AISense_Sight]
bAutoRegisterAllPawnsAsSources = false

これによりAIPerceptionが自動でレベル内にあるPawnBPをすべて視覚のターゲットとして登録するのを防ぐことができます。
代わりに追いかけられるPawnBPにはAIPerceptionStimuliSourceコンポーネントを追加し次のように設定します。(例えば敵に追いかけられるPlayerに設定)
image.png
これで視覚で追ってほしいPawnのみをAIPerceptionに登録できました。
BPでは最適化をする手段が少ないので出来ることはやっておくべきです。

監視対象を忘れるようになる設定

AIPerceptionにはMaxAgeという項目でどれぐらいの時間までターゲットを監視しているかを設定できます。
しかし先ほどと同じConfigファイル内のDefaultEngine.iniに以下の記述をしないとこの機能自体が有効にならないので記述しておきます。

[/Script/AIModule.AISystem]
bForgetStaleActors=True

音を出すアクタの作成

AIPerceptionへ音の刺激を渡すには専用のコンポーネントを実装したクラスからイベントを実行する必要があります。

  1. 適当なActorBPを作成しAIPerceptionStimuliSourceコンポーネントを追加します。
  2. 設定は以下のようにします。
    image.png
    これでAIPerceptionに聴覚の監視対象として登録できました。
  3. ReportNoiseEventで聴覚刺激を通知できます。
    image.png

実装

AIPerceptionの機能は基本的にAIController内で実装していきます。

AIPerceptionコンポーネントの設定

AIControllerにAIPerceptionコンポーネントを追加、SensesConfigの+ボタンを押し監視する項目を追加します。追加したら以下のように設定します。
image.png

編集している値

  • AISense_Sight
    視覚を実装、聴覚はAIHearingconfig
  • SightRadius
    対象を見つける距離、お好きな値で
  • LoseSightRadius
    対象を見失いまでの距離、お好きな値で
    -Detection by Artificial
    視覚で監視する対象を選ぶ。BPだとここを自由にカスタムできないので全部選択しておき、BPの方で処理する。
  • MaxAge
    AIPerceptionが監視対象を忘れるまでの時間。0にしておくと忘れないようになる。視覚の場合視野内にいると毎回更新されているためあまり意味がない。今回は聴覚用。
    前述のDefaultEngine.iniへの記述がないとこの機能は無効になるため注意。

(聴覚の方も似たような項目なので画像のみで割愛)
image.png

知覚イベントの実装

OnTargetPerceptionUpdatedを使用します。AIControllerのイベントグラフにてコンポーネントからこの関数をオーバーライドしBlackboardへ検知したActorやVectorを登録するようにします。

視覚への刺激か聴覚化の刺激化を判別
image.png
聴覚の処理。上画像のBranchのFalse処理、画像内Branchには上画像のBreakAIStimulusをつないでいる。
image.png

各種関数の説明

  • GetSenseClassForStimulus
    受け取った刺激のクラスを取得できる。今回はAISenseSightならTrueにしている。
  • BreakAIStimulus
    受け取った刺激の状態を監視できる。SuccessfullySensedは監視できているか否かを取得でき、刺激の対象が視界外に行くとfalseになる。また、前述のMaxAgeを設定していると一定時間後falseになるようにもできる。
    聴覚処理内では刺激が検知された場所のVector値を使用している。

今回は視覚と聴覚のみ実装しているため、受け取った刺激クラスが視覚の場合はそれがPlayerTagを持っているかの確認をして後の処理へ回す。聴覚の場合はVector値をBlackboardに登録する。
分かりづらいと思うので全体図を貼っておきます。

刺激を忘れたときのイベントの実装

OnTargetPerceptionForgottenを使用する。
コンポーネントからオーバーライドし、以下のように実装。
image.png
Forgottenイベントが発火次第BlackboardのStimulusForgottenをTrueにする。

おわり

まとめ

かなり広い内容で解説してしまったので要点をまとめますと

  • DefaultEngine.ini,DefaultGame.iniに設定を追加
  • 以下のようにコンポーネントを追加し設定を行う
    AIController : AIPerception
    Player,音を出すアクタ : AIPerceptionStimuliSource
  • AIControllerからAIPerceptionのイベントを使用してBlackboardのKey値を更新する

参考

PawnSensingかAIPerceptionかを使うべきかについてのフォーラム

AIPerceptionも使用している公式のBehaviourTreeチュートリアル動画

刺激を忘れるための設定について

AIについてまとまっているスライド

最後に

元々BehaviourTreeを使用したAIは各種BPをまたいで作成するものなのでわかりづらいのに加えて元々のチュートリアルを参照してもらうことが前提でしたので余計わかりづらくなったと思います(今回はその内容を書くととんでもないボリュームになってしまうので省略せざるおえませんでした。。。。)
何か不明な点があればコメントでよろしくお願いいたします。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?