ビヘイビアツリーを分岐させる。徘徊から追跡

提供: socialakiba wiki
移動: 案内検索

最初に

Unreal Engine 4 Intro to Character AI 1 2 - Animation! 3 - Chase Player and Task Switching

Ue4 wander chase001.png

例によってナビゲーションメッシュを仕込み、NPCにアニメーションなどを仕込んでおく。

  • NPC1 (Non player character)
  • AICon1 (NPC1 の AI Controller)
  • BK1 (AICon1 の Blackboard)
  • BT1 (AICon1 の Behavior Tree)
  • Wander (BT1 のタスク。うろうろゆっくりとうろつきまわる)
  • ChasePlayer (BT1 のタスク。プレイヤーのあとを走って追いかける)


BTTaskBlueprintBase.png

タスクは Behavior Tree Window で作って作ってもよいが、 新規作成 task で検索して作ってもよい。

NPC のブループリントを書く

Ue4 wander chase002.png

NPC1 に Box Collider を追加して Sight という名前にする。

Sight を NPC1 の前の方向に配置する。 この領域にプレイヤーが入ると、追跡を開始するようにする。

isRunning と max walk speed の関係

Ue4 wander chase003.png

NPC1 のイベントグラフ。 このイベントグラフは Tick イベントから始まる部分と、On Component Begin Overlap イベントから始まる流れに分かれている。

isRunning という bool 型の変数を作る。 この変数の右側の閉じた目を開かせる(private 変数を public 変数に変える)。Private to public.png

isRunning が true か false で max walk speed を変える。

On Component Begin Overlap

OnComponentBeginOverlap.png

On Component Begin Overlap は Sight を選択した状態で右クリックでメニューを出して on component begin overlap (sight) を出す。

Sight に player が入ったときに、blackboard の isChasing というフラグをセットする。

Ue4 wander chase003 2.png

isRunning は変数一覧からイベントグラフにドラッグアンドドロップして Get isRunning。

Character Movement はコンポーネントからイベントグラフにドラッグアンドドロップ。

Character Movement のピンから伸ばして max walk speed で検索して set。

get blackboard のピンから伸ばして set value as bool。

self は右クリックでメニュー出して self で検索して出す。

== は同じ型の変数どうしが等しいかどうかを判定する。同じ == でも型ごとに違うので注意。ここでは =、または = object、または equal object でメニューを検索して出す。

AI Controller の設定

Ue4 wander chase004.png

AICon1のイベントグラフ。

ビヘイビアツリーを使いますよというだけ。

AIControllerClass.png

NPC1 を開いて self の AI Controller Class を今作った AICon1 に切り替えるのを忘れずに。


Blackboard にキーを登録する

Ue4 wander chase007.png

BK1 のキー isChasing の設定。

isChasing が Set される前はうろうろうろつく。

isChasing が Set された後はプレイヤーを追いかける。

Ue4 wander chase008.png

BK1 のキー TargetPoint の設定。

TargetPoint は NPC がうろつくときの一時的な目的地点。

タスクの作成

Wander(うろつく)

Ue4 wander chase005.png

最初に少し待つ(delay)。

isRunning は false。

NPC1の周辺にランダムな場所を生成して、NPC1の目的地にする。

GetActorLocation は NPC の位置。 GetRandomPointInNavigableRadius はその NPC 周辺からランダムに位置を選ぶ。

BlackboardKeySelector.png

Destination というキーを作る。型は Blackboard Key Selector にする。

Ue4 wander chase005 2.png

Finish Execute の success にチェックを入れる(sequence が右隣の Move To へ移れるようにするため)。

Radius には適当な値を入れる。 Radius が 0 のままだと Wander が呼び出されっぱなしになり、MoveTo に移らない。

Random float in Range にも適当な値を入れる 0.0 から 3.0 など。

ChasePlayer(プレイヤーを追いかける)

Ue4 wander chase006.png

Wander と似てるので複製するかコピペして適当に変更すればよい。

Player を追いかける。

Behavior Tree とデコレータの設定

Behavior Tree は Root から始まって上から下へ、左から右へと実行される。

末端のノードは必ずタスク。 タスクのイベントグラフは Receive Execute で始まり、Finish Execute で終わる。

Finish Execute は、成功か失敗を返す(success をセットすれば成功、しなければ失敗)。

selector は成功が返ってきたらそのまま上に戻る。 失敗したら次の(つまり右隣の)ノードを試す。 成功するまで試す。

sequence は左から右へ失敗するまで順にノードを実行していく。


Ue4 wander chase009.png

BT1 追跡してない場合。

Ue4 wander chase010.png

BT1 追跡している場合。

実行結果

BT NotChasingYet.png
BT Chasing.png

Selector は左から右へ、最初に成功(タスクのイベントグラフの Finish Execute で success に true をセット)したタスクだけを実行して Root に戻る。

Sequence は左から右へ順にノードを実行する。

Root ノードは定期的にイベントを発生させる。

Root ノードがイベントを発生させると、まず Wanderタスクが実行される。 Wanderは一瞬で終わり、次に Move To が実行される。 Move To は Root が次のイベントを発生させるまでずっと実行される。

NPC1 の Sight とプレイヤーのコリジョンが発生すると、 NPC1 のイベントグラフの記述にしたがって Blackboard の isChasing の値が false から true に変更され、これによって Behavior Tree のタスクが Move To から ChasePlayer に切り替わる。

ChasePlayer は isRunning を false から true に切り替えるので、NPC1 のイベントグラフに記述されたように max walk speed が変更される。