徘徊!追跡!見失う!いない!徘徊再開!

※注意!

前回の記事「敵のランダムな徘徊方法!」を読んでいること前提で進めます!

free-gamer.hatenablog.com

 

今回は

 

視界に入ったプレイヤーの追跡方法!

見失ったら見失った地点まで移動!

一定時間待機してプレイヤーが見つからなければ徘徊再開!

 

の3本立てでお送りします。

 

 

Enum(列挙体)を作成します。

「Find_or_Lost_Player」と名付けます。

f:id:Free_Gamer:20190810003818p:plain

中身

f:id:Free_Gamer:20190810003830p:plain

この列挙体は

 

プレイヤーを見つけた(Find)か見失った(Lost)か

 

を定義する時に使います。

 

「Enemy_BB」を開きます。

「新規キー」を3つ追加します。

f:id:Free_Gamer:20190810004524p:plain

「Player」(Object型)

f:id:Free_Gamer:20190810004646p:plain

「RandomLocation」(Vector型)

f:id:Free_Gamer:20190810004748p:plain

「Find_Lost」(Enum型)

f:id:Free_Gamer:20190810004800p:plain

 

インターフェースを作成します。

「EnemyInterface」と名付けます。

f:id:Free_Gamer:20190810011613p:plain

「EnemyInterface」を開き

新規インターフェースを2つ作成します。

f:id:Free_Gamer:20190810011829p:plain

「FindPlayerBPI」は、プレイヤーを見つけた時に呼ばれるイベント

「LostPlayerBPI」は、プレイヤーを見失ったときに呼ばれるイベントです。

 

「Enemy_Con」を開きます。

「AIPerception」コンポーネントを追加します。

f:id:Free_Gamer:20190810010035p:plain

「AIPerception」の詳細パネルを以下のように設定します。

f:id:Free_Gamer:20190810010720p:plain

設定方法の詳細は以下のブログに書いています。

↓ご参考に。

qiita.com

 

関数を作成します。

「SetBlackboardValues」と名付けます。

f:id:Free_Gamer:20190810013240p:plain

「SetBlackboardValues」を開き

以下の処理を作成します。

f:id:Free_Gamer:20190810013408p:plain

ブラックボードの指定したキーに

値を格納する為の処理です。

 

「SetBlackboardValues」関数のインプットピン

f:id:Free_Gamer:20190810013554p:plain

こんな感じですね。

f:id:Free_Gamer:20190810024410p:plain


 

 

イベントグラフに

以下の処理を作成します。

f:id:Free_Gamer:20190810004916p:plain

視界に入ったアクターの情報をゲット

「GetActorsPerception」の「InfoTarget」ピンには

視界に入ったアクターが格納されています。

それを変数に格納します。

f:id:Free_Gamer:20190810004953p:plain

プレイヤーが視界に入ったかどうかの判定を行います。

プレイヤーが視界に入ったらTrue

プレイヤーが障害物で遮られたらFalse

f:id:Free_Gamer:20190810005032p:plain

↓プレイヤーが障害物で遮られたかどうかの判定は以下のノードでできます。

f:id:Free_Gamer:20190810005529p:plain

対象のアクターが障害物で遮られてない場合

視界から外れていてもTrue

対象のアクターが障害物で遮られたらFalse

といった感じです。

 

ブランチで判定を行った後は

自作関数「SetBlackboardValues」内に格納します。

f:id:Free_Gamer:20190810005724p:plain

Trueに繋がる処理

「SetBlackboardValues」関数で値を格納しています。

その後、「FindPlayerBPI」で「Enemy_Con」を所有している

「Enemy」のイベントを呼び出しています。

f:id:Free_Gamer:20190810011050p:plain

Falseに繋がる処理

SequenceノードでDoOnceにResetの処理をかけてから

「SetBlackboardValues」関数に値を格納しています。

f:id:Free_Gamer:20190810011138p:plain

 

「Enemy_BT」を開きます。

「新規タスク」を作成します。

f:id:Free_Gamer:20190810012455p:plain

新規作成されたタスクに

「VigilanceAround_BT_Task」と名付けます。

f:id:Free_Gamer:20190810012706p:plain

「VigilanceAround_BT_Task」を開き

以下の処理を作成します。

f:id:Free_Gamer:20190810012839p:plain

変数

f:id:Free_Gamer:20190810012934p:plain

 WaitDuration・・・後から編集しやすいように編集可能に。

 

「Enemy_BT」を開きます。

以下の処理を作成します。

左側から見ていきましょう。

f:id:Free_Gamer:20190810014031p:plain

徘徊処理です。

 

f:id:Free_Gamer:20190810014322p:plain

プレイヤーを見つけていない(Lost)状態だと

「Enemy」はランダムな位置に移動し続け徘徊する。

これは前回のブログ「敵のランダムな徘徊方法!」でやった内容通りでしょう。

けど1つ違うのは

Sequenceノードに「Blackboardデコレーター」が追加されているところです。

 

この「Blackboardデコレーター」の詳細パネルは以下の通り。

f:id:Free_Gamer:20190810014828p:plain

オブザーバーを中止を「Self」にしています。

「Self」にすることで

徘徊途中でプレイヤーを見つけた時

即座に徘徊処理を中止できます。

 

KeyQueryは「IsEqualTo」

KeyValueは「Lost」

BlackboardKeyは「Find_Lost」

にしてます。

 

要は

 

プレイヤーを見つけてない(Lost)した状態なら

徘徊処理を実行する

 

という感じです。

 

プレイヤーを追跡する処理です。

徘徊処理が中断されると、この処理が実行されます。

f:id:Free_Gamer:20190810015602p:plain

「MoveTo」ノードで

プレイヤーの位置まで移動という感じです。

 

この処理の「Blackboardデコレーター」の詳細パネルを以下のように設定します。

f:id:Free_Gamer:20190810015916p:plain

オブサーバーを中止を「Both」にしています。

理由は・・・
説明したいところですが自分でもはっきりわかっていないので
悔しくも割愛します・・・。すいません・・・。

 

KeyQueryは「IsEqualTo」

KeyValueは「Find」

BlackboardKeyは「Find_Lost」

 

つまり

 

プレイヤーを見つけた(Find)ら

追跡処理を実行する。

 

といった感じです。

 

「MoveTo」ノードの詳細パネルです。

「Player」の位置まで移動させたいので

BlackboardKeyを「Player」にしています。

f:id:Free_Gamer:20190810020332p:plain

 

プレイヤーを見失ったときの処理です。

f:id:Free_Gamer:20190810020534p:plain

「MoveTo」ノードで

プレイヤーを見失った位置まで移動します。

 

その後、作成したタスク「VigilanceAround_BT_Task」で

「WaitDuration」に入れた値分その場で待機。

プレイヤーが見つからなければ

この処理は成功(終了)し

また徘徊処理に戻る。

 

といった感じです。

 

この処理の「Blackboardデコレーター」の詳細パネルを以下のように設定します。

f:id:Free_Gamer:20190810021555p:plain

オブサーバーを中止を「None」に。

 

KeyQueryは「IsEqualTo」

KeyValueは「Lost」

BlackboardKeyは「Find_Lost」

 

つまり

 

プレイヤーを見失った(Lost)とき

この処理を実行する

 

といった感じです。

 

「MoveTo」ノードの詳細パネルです。

プレイヤーを見失った地点まで移動させたいので

BlackboardKeyを「LostPlayerLocation」にします。

f:id:Free_Gamer:20190810021933p:plain

 

「VigilanceAround_BT_Task」タスクの詳細パネルです。

WaitDurationの値を「5」に設定します。

これで、プレイヤーを見失った地点に到達した後

「5秒間」その場で待機することになります。

f:id:Free_Gamer:20190810022202p:plain

 

「Enemy」を開きます。

イベントグラフに以下の処理を作成します。

徘徊する時と追跡する時で

移動速度を変えています。

f:id:Free_Gamer:20190810022559p:plain

変数

f:id:Free_Gamer:20190810022906p:plain
NormalSpeed・・・徘徊速度。デフォルト値は「180」

ChaseSpeed・・・追跡速度。デフォルト値は「500」

 

これですべて完了です!

 

レベル内に障害物を何個か置いて・・・

f:id:Free_Gamer:20190810023433p:plain

 

さっそくプレイしてみましょう!

youtu.be

 

徘徊時は、ランダムな位置に移動。

移動速度は遅め。

 

プレイヤー追跡時は

移動速度が速くなる。

発見したか分かりやすいように

赤いSphereが見つかった地点に表示されるはずです。

 

プレイヤーを見失ったときは

見失った地点まで移動。

見失ったか分かりやすいように

見失った地点に

青いSphereが表示されるはずです。

 

一定時間後

プレイヤーがいなければ

再び徘徊。

 

といった感じです。

 

くssssssっそ長くてだるかったと思いますが

何も考えずにただやり方をトレースするだけでも

普通に出来るはずです。(説明不足とかなきゃ)

 

ここまで読んでくれてありがとうございますw

 

それではまた!^^ノシ