ゲーム開発備忘録

ゲームプログラマー UE4・5向けの記事を書いておりますので見ていただけるとありがたいです。

【ゼロからアンリアルエンジン5】〔AI編〕⑤視覚から意思決定するNPCを作ってみよう

目次

 

はじめに

バージョンアップしました!

UE5.02→5.03

うまく動かない場合はこちらを読んでね

namiton.hatenablog.jp

 

注意

UE5.0.3の現在の情報です。

今後のアップデートによりUIや機能が変更される可能性があることをあらかじめご理解ください。

 

前回

namiton.hatenablog.jp

 

今回は前回作成した目と耳の情報を元にNPCが意思決定できるようにしていきます。

 

解説

⓪概要

BP_NPC_Controllerで感覚信号を分岐する処理を前回組みました。

この信号をもとにブラックボードの値を書き換えます。

ビヘイビアツリーはブラックボードを参照しているため、値からコンポジットの処理を決定します。

①見つけているかどうかのキーの追加

BB_NPCを開きます。

 

Bool型の変数を作成します。

 

プレイヤーを見つけたかどうかのキーにしたいので名前をFoundPlayerKeyにしました。

 

②追いかける条件の変更

BT_NPCを開きます。

 

既存のSequenceにあるデコレーターを削除します。

 

Wait中でもプレイヤーを見たら追いかけてほしいのでノードの順番を反転させます。

 

このように右側のプレイヤーを追いかける側に変更します。

 

SequenceにBlackboardを追加します。

 

FoundPlayerKeyがNotSet=Falseの場合は、見つけていないので確率に応じた挙動を行います。オブザーバーをBothにしたのはwaitノード中でもFoundPlayerKeyの変更で、すぐに右側の判定を行うためです。

 

FoundPlayerKeyがSetの場合はプレイヤーを追いかけるようにします。


こんな感じになったらOKです。

 

③FoundPlayerKeyのセット

BP_NPC_Controllerを開きます。

ブラックボードを変数化しておきましょう。


ブラックボードのキーに登録するSet Valuw as Boolから見えているかの情報をセットします。

 

実行してみましょう。

視界に入っている場合は追いかけてくるようになりました。

 

④応用!頭の向きに応じたAIPerception

AIPerceptionはRoot Componentを参照しているため、頭の向きに追従しません。

そのためアニメーション由来で索敵(周囲を見回す)などを再生してもAIPerceptionの検出する範囲は変わりません。そのためAIControllerをC++で改変して頭の位置とAIPerceptionの位置と向きを同期させます。

 

こちらのサイトを参考に実装しました。

qiita.com

 

ツールC++から

AIControllerを親としたCustomAIControllerの作成

サイトのように.cppと.hを編集

ビルド、再コンパイル

 

CustomAIControllerクラスを継承したブループリントの作成

 

BP_NPC_Character

HeadSocketの作成

制御元のControllerを変更。

 

BP_CustomNPCController

BP_CustomNPCControllerに既存のAI関連のノードの移植(コピペ)

C++クラスのCustomAIControllerで作成した関数のOverride。

 

BTT_SetActionPoint

ビヘイビアツリーのタスクのAIControllerのキャスト先の変更

 

HeadSocketに依存しているので、より柔軟性の高いAIPerceptionの運用ができるようになります。

 

最後に

UE4やUE5向けの記事を書いています。

皆様の応援が投稿のモチベーションになりますので

コメントやTwitterのフォローなどしていただけるとありがたいです。

それではよきゲーム開発を。