UE5の追いかけてくる敵を作る方法
UE5のゲーム制作で主人公を追いかけてくる敵が必要になることは多い。
そこで視認範囲にプレイヤーが入ったら追いかけてくる敵を作る方法を紹介していく。
なお、以前に敵をランダム移動させる記事を作成している。今回の記事はそれをベースに説明しているので先に以下を確認してほしい。
敵の移動UE5の追いかけてくる敵を作る方法目次
視認範囲設定視認状況を確認する処理
追跡処理作成と切り替え設定
目次にもどる
視認範囲設定
まずは視認範囲設定を行っていく。
コンテンツブラウザからBP_EnemyControllerを開き、画面左上の「追加」を選択し、AI Perceptionを検索して選択する。
.jpg)
AI Perceptionを選択する。
.jpg)
その状態で画面右のAIパーセプションのSenses Configの項目の+ボタンを押す。
.jpg)
出た項目の下矢印マークを押す。
.jpg)
AI Sight Config(視認を制御ができる機能)を選択する。
.jpg)
以下のように下矢印マークを押して開こう。
.jpg)
重要な項目の説明は以下の通りだ。
Sight Radius
「この敵キャラ」から「この値の距離以内のもの」を視認する。今回は1000(つまり10m)に指定。
Lose Sight Radius
「この敵キャラ」から「この値の距離を超えたもの」を視認しなくなる(見失う)。今回は1500(つまり15m)に指定。
PeripheralVisionHalfAngleDegrees
片目の視野角の角度を示す。今回は75に指定。
Detection by Affiliation
Detection by Affiliation
配下に3項目あり、このキャラが味方か敵かで行動の切り分けが可能。C++じゃないと使えない。ブループリントを使う場合はひとまず3つともチェックをつけていこう。
目次にもどる視認状況を確認する処理
BP_EnemyControllerでAI Perceptionを選択した状態でイベントの項目のOn Target Perception Update(何らかのターゲットを感知)の+マークを押してノードを追加する。
.jpg)
以下のようにノードを配置する。
.jpg)
注意点としてはSet Value as Objectについては、以下のように状況に合わせた表示のチェックを外さないと検索から出ない(それ以外の検索では役立つのでSet Value as Objectの検索時のみチェックを外すといい)。
.jpg)
Set Value as ObjectについてはTargetとしてBlackboardを指定し、Make Literal NameでTargetPlayerを作成(後でブラックボードでTargetPlayerを作って使う)。
.jpg)
どういう処理が行われているのか説明する。On Target Perception Updateはプレイヤーキャラ以外(同じ敵など)も認識してしまう。よってGet Player CharacterしてEqualでつなぎ、プレイヤーキャラを認識した場合のみBranchがTrueとなり後続の処理へ。
.jpg)
Branchの後続には2つ目のBranchがある。
.jpg)
「On Target Perception Update」→「Break AIStimulusのSuccessfully Sensed」により視認が成功したら「2つ目のBranchのCodition」へ入力されTrueが出力される。そうでないならfalseが出力される。
Trueだった場合は、「Set Value as Object」のノードでブラックボードのTargetPlayerにOn Target Perception Updateで視認したキャラ(つまりプレイヤーキャラ)の情報が代入される。falseだった場合は代入されない。
目次にもどる追跡処理作成と切り替え設定
BT_Enemyを開き、右上のブラッグボードを選択してBB_Enemyを開き、新規キーを選択してObjectを選択する。
.jpg)
追加されたObjectキーの名前をTargetPlayerにする(先ほどのBP_EnemyControllerでMake Literal Nameで入力したキー名)。
.jpg)
Objectキーを選択した状態で画面右を見て、Key typeのBase ClassをActorにして保存する。
.jpg)
画面右上のビヘイビアツリーを選択し、BT_Enemyの画面に戻る。
以下のようにROOTの次にSelector(後続の左の処理から実行し、処理できなかった場合は右の処理に移る)を設置し、配置を以下のように変更する。
.jpg)
左にあるSequenceを選択し右クリックし、「デコレーターを追加」を選択し、Blackboardを選ぶ。
.jpg)
すると以下のように「Blackboard Based Condition」が出るので選択する(ノードの中の上のBlackboard Based Conditionのみを選択する。間違いやすいので注意)。
.jpg)
画面右をみて、ブラックボードのBlackboard Keyを「TargetPlayer」にし、ディスクリプションのNode Nameを「Find Target?」にする。
.jpg)
以下のようになる。Find Target?処理でTargetPlayerに何か入っていれば下のSequence処理が実行されるようになる。
.jpg)
以下のようにノードを追加する。
.jpg)
move toのBlackboard KeyをTarget Playerに設定。WaitはWait timeを1秒に設定。つまり、プレイヤーの位置まで移動した後に1秒待機する追跡処理となる。
問題はプレイヤー追跡処理とランダム行動処理の切り換えの設定だ。
現状では例えばランダム行動処理中にプレイヤーを視認したとしてもプレイヤー追跡処理には移らない。ランダム行動処理が終了してRootから「Find Target?」まで来てようやく「TargetPlayer」に値が入っているかを判断するためだ。
瞬時に行動を変更するには、Find Target?を選択し、画面右のFlow Controlのオブサーバーを中止(Observer aborts)を変更する。

ここは重要な設定で以下のような選択肢がある。
None
設定なし。デフォルトではNoneになっている。
Self
値がなくなったら、次の処理を実行する。
Lower Priority
値が入ったら、別の処理をしていても、この処理を実行する。
Both
SelfとLower Priorityの両方を兼ねた設定。
今回はObserver abortsをBothに設定する。プレイヤー追跡処理をしていても見失った(TargetPlayerの値がなくなった)らランダム移動処理に瞬時に切り替えてほしいし、ランダム移動処理でプレイヤーを視認した場合も瞬時にプレイヤー追跡処理に切り替えてほしいからだ。
ゲームを実行してみよう。ランダムに行動し、プレイヤーが視認範囲に入ったら追いかけてくる敵を作ることができた(見失うとランダム行動に戻る)。