敵キャラクターに目を持たせる
前回作成したAI_AICharacterを開き、コンポーネントの追加で”AIPerception”を追加します。
追加したAIPerceptionを選択した状態で詳細タブの”AIパーセプション”のプラスボタンをクリックし、”AI Sight config”を追加します。基本的に数値はそのままで構いませんが、Detection by Affiliation内のチェックボックスについては、全てにチェックを入れるようにしてください。(これは敵・味方・中立のどれを視界に入れるかの設定ですが、ここでは全てを視界に入れるという設定にしています)
これで敵キャラクターに目を持たせることができました。
プレイヤーを発見・見失う処理の定義
AIPerceptionコンポーネントを追加することで、敵に目を追加することができましたが、プレイヤーを発見したという処理を記述する必要があります。
上記で追加したAI Perceptionのイベント一覧から”On Perception Update”イベントを作成し、以下のようにノードを組んでいきます。今回はAI Perceptionには視界の情報しか持たせていないので、プレイヤーが視界に入った・出たという判定を行う処理となります。
プレイヤーがAIで動き回っている敵の視界に入ると「見つけた」と表示され、視界から外れると「見失った」と表示するだけの処理となっています。
敵キャラクターの状態定義
敵キャラクターには、前回で作った「巡回」と、今回作成する「追跡」という2種類の状態が必要となる為、列挙型を定義して敵の状態を管理していきます。
まずは、コンテンツドロワー上で右クリック->”ブループリント”->”列挙型”を選択し、名前を”EN_AICharacterState”としました。(ENはEnum(列挙型)の略です)
列挙型には”Patrol”(巡回)と、”Chase”(追跡)を定義しました。
敵キャラクターの状態をブラックボードで管理する
敵キャラクターはAIで動作しているので、上記で作成した状態をブラックボードで管理します。
前回作成しておいて使っていなかったブラックボード”BB_AICharacter”を開き、列挙型でStateという変数を追加します。
プレイヤーを発見・見失うをブラックボードの伝える
上記でプレイヤー発見時に「見つけた」、ロスト時に「見失った」と表示している部分を、ブラックボード上の変数を書き換えるように変更します。(今回はサンプルの為、デバッグ用のPrintStringも残したままの処理とします)
対象となるBPは”AI_AICharacter”で、OnPerceptionUpdatedイベントの最後に以下のようなノードを追加してください。
ビヘイビアツリーに条件分岐を入れる前準備
ビヘイビアツリー(BT_AICharacter)を以下のように修正します。
大きく分けて「巡回」か「追跡」か分岐するようになっており、巡回は前回作成したBTT_AICharacterTraceMoveを呼び出しています。追跡の場合の処理は後程作成するので、現在は何も呼び出していません。
また、現状では条件分岐の条件も設定していない為、このままでは追跡側の処理が行われることはありません。
ビヘイビアツリーに条件分岐を入れる
巡回側のSequenceノード上で右クリックし、”デコレーターを追加”->”Blackboard”を選択してください。すると、Sequenceの上に”Blackboard Based Condition”というパネル(デコレーター)が追加されますので、それをクリックし、詳細パネルを以下のように設定します。
これは、ブラックボード上のStateがPatrolの場合のみ、巡回処理を行うという条件設定となります。
ということは、追跡側の処理にもデコレーターを追加したくなりますので、以下のようにしました。
もはや説明不要ですが、ブラックボード上のStateがChaseの場合に追跡処理(現時点では何も処理が無いので、敵キャラクターが立ち尽くす)が実行されるようになるはずです。
プレイ開始
上記のビヘイビアツリーが組めたらプレイしてみましょう。
敵キャラクターの背後に回ると動き出し、見つかると動きが停止することが分かります。
AI_AICharacterで追加したAI PerceptionコンポーネントのAISense_Sight(視界情報)で、敵の視界の範囲や視野角を設定することができるのですが、初期値のままだと結構な範囲を見ているので、敵キャラクターの視界の広さに驚くかもしれません。
”Sight Radius”(視界範囲)や”Lose Sight Radius”(見失う範囲)やPerpheralVisionHalfAngleDegrees”(視野角)を調整してみても面白いかもしれません。
敵キャラクターに追跡させる
現状では、敵に見つかると敵が立ち尽くしてしまうので、プレイヤーを追跡してくるようにします。
ブラックボードに追跡対象のActor(プレイヤー)を保持したいので、ブラックボードに変数を追加します。名前は”ChaseTarget”とし、型はObject型を選択のうえ、BaseClassをActorとしました。
次に、プレイヤー発見時にChaseTargetにプレイヤーを格納し、プレイヤーロスト時にChaseTargetをクリアする処理を組みます。AI_AICharacterを開き、以下のようにしました。(State)を格納する時とほぼ一緒ですね。
プレイヤー発見時にChaseTargetに対して”Get Player Character”を設定してしまっていますが、正確には「発見したキャラクター」を設定すべきです。今回は解説の為、プレイヤーのみを対象としたロジックとして記述していますが、このやり方はおススメしません。(遠くのノードから線を引っ張ってきたら分かりにくい為の処置です)
そして、ビヘイビアツリーに追跡側の処理にMoveToノードを追加します。どこに向かって歩かせるかを指定できるので、上記で追加した”ChaseTarget”を指定してください。
このまま実行すると、プレイヤーと同じ速度で追跡されてしまい、振り切ることが困難な為、敵キャラクターの速度を落としておきます。”BP_AICharacter”を開く、CharacterMovementコンポーネントの”Max Walk Speed”を300位にしておきましょう。
追跡確認プレイ
早速プレイしてみます。
敵キャラクターに発見されると、敵キャラクターがプレイヤーに向かって歩いてくるようになります。うまく物陰に隠れて、敵キャラクターの視界から消えることが出来ると、敵キャラクターは巡回ルートに戻っていきます。
視界から消えた途端に追跡を止めてしまうという、とても聞き分けの良い敵キャラクターが完成しました。本来であれば、見失った地点を探しに行くとか、見失ってもある程度は予測して追跡してくる等のロジックを組むべきですが、今回はサンプルなので、これで追跡処理とさせて頂きます。
次回は、巡回ルートから外れた場所に戻る方法を紹介します。
No responses yet