徘徊!追跡!見失う!いない!徘徊再開!
※注意!
前回の記事「敵のランダムな徘徊方法!」を読んでいること前提で進めます!
今回は
視界に入ったプレイヤーの追跡方法!
と
見失ったら見失った地点まで移動!
と
一定時間待機してプレイヤーが見つからなければ徘徊再開!
の3本立てでお送りします。
Enum(列挙体)を作成します。
「Find_or_Lost_Player」と名付けます。
中身
この列挙体は
プレイヤーを見つけた(Find)か見失った(Lost)か
を定義する時に使います。
「Enemy_BB」を開きます。
「新規キー」を3つ追加します。
「Player」(Object型)
「RandomLocation」(Vector型)
「Find_Lost」(Enum型)
インターフェースを作成します。
「EnemyInterface」と名付けます。
「EnemyInterface」を開き
新規インターフェースを2つ作成します。
「FindPlayerBPI」は、プレイヤーを見つけた時に呼ばれるイベント
「LostPlayerBPI」は、プレイヤーを見失ったときに呼ばれるイベントです。
「Enemy_Con」を開きます。
「AIPerception」コンポーネントを追加します。
「AIPerception」の詳細パネルを以下のように設定します。
設定方法の詳細は以下のブログに書いています。
↓ご参考に。
関数を作成します。
「SetBlackboardValues」と名付けます。
「SetBlackboardValues」を開き
以下の処理を作成します。
ブラックボードの指定したキーに
値を格納する為の処理です。
「SetBlackboardValues」関数のインプットピン
こんな感じですね。
イベントグラフに
以下の処理を作成します。
視界に入ったアクターの情報をゲット
「GetActorsPerception」の「InfoTarget」ピンには
視界に入ったアクターが格納されています。
それを変数に格納します。
プレイヤーが視界に入ったかどうかの判定を行います。
プレイヤーが視界に入ったらTrue
プレイヤーが障害物で遮られたらFalse
↓プレイヤーが障害物で遮られたかどうかの判定は以下のノードでできます。
対象のアクターが障害物で遮られてない場合
視界から外れていてもTrue
対象のアクターが障害物で遮られたらFalse
といった感じです。
ブランチで判定を行った後は
自作関数「SetBlackboardValues」内に格納します。
Trueに繋がる処理
「SetBlackboardValues」関数で値を格納しています。
その後、「FindPlayerBPI」で「Enemy_Con」を所有している
「Enemy」のイベントを呼び出しています。
Falseに繋がる処理
SequenceノードでDoOnceにResetの処理をかけてから
「SetBlackboardValues」関数に値を格納しています。
「Enemy_BT」を開きます。
「新規タスク」を作成します。
新規作成されたタスクに
「VigilanceAround_BT_Task」と名付けます。
「VigilanceAround_BT_Task」を開き
以下の処理を作成します。
変数
WaitDuration・・・後から編集しやすいように編集可能に。
「Enemy_BT」を開きます。
以下の処理を作成します。
左側から見ていきましょう。
徘徊処理です。
プレイヤーを見つけていない(Lost)状態だと
「Enemy」はランダムな位置に移動し続け徘徊する。
これは前回のブログ「敵のランダムな徘徊方法!」でやった内容通りでしょう。
けど1つ違うのは
Sequenceノードに「Blackboardデコレーター」が追加されているところです。
この「Blackboardデコレーター」の詳細パネルは以下の通り。
オブザーバーを中止を「Self」にしています。
「Self」にすることで
徘徊途中でプレイヤーを見つけた時
即座に徘徊処理を中止できます。
KeyQueryは「IsEqualTo」
KeyValueは「Lost」
BlackboardKeyは「Find_Lost」
にしてます。
要は
プレイヤーを見つけてない(Lost)した状態なら
徘徊処理を実行する
という感じです。
プレイヤーを追跡する処理です。
徘徊処理が中断されると、この処理が実行されます。
「MoveTo」ノードで
プレイヤーの位置まで移動という感じです。
この処理の「Blackboardデコレーター」の詳細パネルを以下のように設定します。
オブサーバーを中止を「Both」にしています。
理由は・・・
説明したいところですが自分でもはっきりわかっていないので
悔しくも割愛します・・・。すいません・・・。
KeyQueryは「IsEqualTo」
KeyValueは「Find」
BlackboardKeyは「Find_Lost」
つまり
プレイヤーを見つけた(Find)ら
追跡処理を実行する。
といった感じです。
「MoveTo」ノードの詳細パネルです。
「Player」の位置まで移動させたいので
BlackboardKeyを「Player」にしています。
プレイヤーを見失ったときの処理です。
「MoveTo」ノードで
プレイヤーを見失った位置まで移動します。
その後、作成したタスク「VigilanceAround_BT_Task」で
「WaitDuration」に入れた値分その場で待機。
プレイヤーが見つからなければ
この処理は成功(終了)し
また徘徊処理に戻る。
といった感じです。
この処理の「Blackboardデコレーター」の詳細パネルを以下のように設定します。
オブサーバーを中止を「None」に。
KeyQueryは「IsEqualTo」
KeyValueは「Lost」
BlackboardKeyは「Find_Lost」
つまり
プレイヤーを見失った(Lost)とき
この処理を実行する
といった感じです。
「MoveTo」ノードの詳細パネルです。
プレイヤーを見失った地点まで移動させたいので
BlackboardKeyを「LostPlayerLocation」にします。
「VigilanceAround_BT_Task」タスクの詳細パネルです。
WaitDurationの値を「5」に設定します。
これで、プレイヤーを見失った地点に到達した後
「5秒間」その場で待機することになります。
「Enemy」を開きます。
イベントグラフに以下の処理を作成します。
徘徊する時と追跡する時で
移動速度を変えています。
変数
NormalSpeed・・・徘徊速度。デフォルト値は「180」
ChaseSpeed・・・追跡速度。デフォルト値は「500」
これですべて完了です!
レベル内に障害物を何個か置いて・・・
さっそくプレイしてみましょう!
徘徊時は、ランダムな位置に移動。
移動速度は遅め。
プレイヤー追跡時は
移動速度が速くなる。
発見したか分かりやすいように
赤いSphereが見つかった地点に表示されるはずです。
プレイヤーを見失ったときは
見失った地点まで移動。
見失ったか分かりやすいように
見失った地点に
青いSphereが表示されるはずです。
一定時間後
プレイヤーがいなければ
再び徘徊。
といった感じです。
くssssssっそ長くてだるかったと思いますが
何も考えずにただやり方をトレースするだけでも
普通に出来るはずです。(説明不足とかなきゃ)
ここまで読んでくれてありがとうございますw
それではまた!^^ノシ