GASP-ALSでアクション その6 敵AI3 ビヘイビアツリー

※本サイトはアフィリエイト広告を利用しています。

テーマは敵キャラクターを動かそう ビヘイビアツリー編です
GASPのALS版をもとに、モーションマッチで華麗に障害物を乗り越えるアクロバティックな敵キャラをつくりましょう。

遊べる完成形はこちらで公開中 yossi40-100/GASP-ALS: Game Animation Sample with ALS Layering

本記事はビヘイビアツリーの初歩(Hello World!)です。

ステップ3の記事です 07:40~

手始めに

ビヘイビアツリーとブラックボード

8番ライク解説のときより複雑な制御をしたいので、AIのビヘイビアツリーを作成します
適当な名前を付けましょう

このアセットは他と違って直接変数を管理できません
なのでその代わりにブラックボード つまり黒板を用意してここに関係者で読み書きしてやりとりします

よっしー
よっしー

Behavior TreeはBT_**
Black BoardはBB_**
名前が同じだと勝手に紐づきます

BT_AI (何も選択していない状態の)詳細欄

もし紐づいてない場合は手動で参照しましょう
また、基本的にセットで使うものなので左上のボタンで編集画面を行き来できます

BB_AI > ブラックボード

黒板といってもどこにでも自由に書けるわけではなく、どちらかというと鍵付きのロッカーのようなイメージです

デフォルトでSelfActorという名前のキーが登録されて、操作中のキャラクターの参照が自動的に管理されます
新規キーで中身の変数の型を選んで追加します

プレイヤーを認識させる目標とするため「オブジェクト」型の情報を作りTargetActorと名付けます

また、今回は追いかけていないときの目的地を座標で指定したいので、ベクター型の情報にターゲットロケーションと名付けます

ターゲットアクターのほうはオブジェクト型だと自由度が高く、いろいろなオブジェクトを入れられますが、
選択すると設定欄でもう少し細かい設定もできます
基本クラスでオブジェクトのなかでもアクターに絞り込みみたいな設定が可能です

よっしー
よっしー

「オブジェクト」って抽象的すぎて使う側が何入れていいのかわからんのケア的な

ビヘイビアツリーの基礎

では変数の用意ができたのでいよいよビヘイビアツリーに行動パターンを作っていきましょう

BT_AI > BehaviorTree

ルートが開始地点です。ルートの下から線を引っ張って、子供の要素をツリー状に配置していきます
ルート直下には3種類のノードしかおけません

コンポジットというカテゴリ名は覚えなくてよいですが、まずはSelectorを置いてみます
その下におけるノードはたくさん選択肢が出てきました

先ほどと同じCompositesに加えて、Tasksというくくりが基本的に末端で実際の行動を行うノードです

よっしー
よっしー

MoveToはブループリントのAIMoveToと同じです
Waitは指定時間待つのでDelay的なやつですね

子を持てるコンポジットを組み合わせることで大きなツリーを作ることもできます

分岐する前の上流が優先で同じレベルのものは左から優先されます

優先順が右上の数字でわかるようになっています

下のほうに置いたとしても3つともセレクターの子なので、SequenceよりもWaitの優先度が一番低い状態です

よっしー
よっしー

配置があまりにも不規則だと見づらいし、処理順がバグる可能性があるので注意しましょう。基本は上流かつ左が優先です。

Selector

セレクターは子供がだれか「成功」する「まで」次の子供を実行するものです。

さきほどのの場合、①移動が成功したらその後の②③は動きません。移動ができないとき次の②Sequenceが実行され、それも失敗したら③Waitが動きます

よっしー
よっしー

Waitは基本的に失敗しません
なのでSelectorの下に、Waitより右になにかつないでも動くことはありません

Sequence

シーケンスは逆に子のいずれかが「失敗」する「まで」続けるものです

こうつなぐと、②移動できたらそのあと③休憩もする連続処理になります

Simple Parallel

メインタスクをやっている間、ながら作業をするものです。(※本記事では扱いませんがあとで使います)

巡回→追跡優先

ではコピペしてセレクターの左側につないでみましょう。左側が失敗したときだけ右側が動く形になります

つまり左側が優先度の高いツリーで右側はそれより優先度の低いツリーです

よっしー
よっしー

まれに、優先度の低いタスクを左側に配置するチュートリアルがあります。のちに説明する条件分岐でやれるはやれますが、それをやっちゃうと巨大化していくとわけわからなくなるのでやめましょう。
(とはいえ自分で痛い目にあって学ぶのも近道だったり。。。)

ブループリントと同じくCキーでコメントも追加できます

普段はランダム位置を散歩するけど、プレイヤーを発見したら追いかける」という割り込み作業を設定していきましょう

散歩か追いかけるかは追いかけるほうが優先なので左側を追いかける処理にします
②MoveToの紫の部分をクリックして、詳細欄でさきほど用意したターゲットアクターにキーを変更します

これで、もしターゲットアクターにプレイヤーキャラクターが設定されていたら、プレイヤーを追いかける処理になります

よっしー
よっしー

プレイヤーじゃなくてもアクターをセットしたらそれを追いかけます

中身が設定されていないときは2番の移動に失敗するのでシーケンスも失敗終了となり
0番のセレクターの子がまだ成功していないので次の4番のシーケンスに進みます

巡回は今回は経路を決めるのではなく、ランダムな位置に移動させる仕様とします。
位置情報を設定しましょう

またちょっと動いて5秒じっとしているのは少し長いかなと思います。お好みですが今回は1秒に変更してみます

その次のRandom Deviationは「ばらつき」で、1秒にすると 1±1秒で最小0秒~最大2秒待つ設定 になります。0.5にしておきます

よっしー
よっしー

規則的だと攻略しやすくなるのを手軽にばらつかせられます
もちろんお好みで

移動する場所が決まらないと成功しないので、移動する場所を自分で考えて散歩してもらいましょう
事前に定義されていない仕事は画面上のボタンから「新規タスク」を作成します

ビヘイビアツリータスクでBTTask_**またはBTT_**です(2流派あるっぽい)
BTT_RandomLocation とでも名付けておきます

BTT_RandomLocation > イベントグラフ

おなじみのブループリントのイベントグラフです
関数オーバーライドから ReceiveExecuteAI イベントを作ります

これはビヘイビアツリーから実行要求を受け取ったときに発動するイベントです

よっしー
よっしー

どれ?って忘れるので初めから置いておいてほしいやつです( ;∀;)

ここでランダムな位置を出してくれる「Get Random Location in Navigable Radius」ノードをつなぎます

このイベントはコントローラとその制御対象のポーンの情報をくれるのですが、ポーンのアクターロケーションを取得し、現在地を起点に次行く場所を決めます

Radiusが起点からの最大距離なので、これを適当に10メートル(1000㎝)としておきます

これで計算された場所情報を、ビヘイビアツリーの MoveTo が参照できるようにするため
ブラックボードに書き込む必要があります

ブループリントからブラックボードに書き込む処理は、書き込む対象の変数から線を引っ張って
Set Blackboard Value as 〇〇 です。〇〇の部分は適切なものに絞り込まれます

どのキーに書き込むかのキーの指定が構造体で面倒ですが、変数化して公開するのが一般的な手順のようです

ここの目玉を開きましょう。これでビヘイビアツリーから設定できるようになります

これでこのタスクは終了 ではありません

最後に FinishExecute が「必須」です(関数のときのリターンみたいなもの)

よっしー
よっしー

あとでこれをつけ忘れてめっちゃ嵌りました

この処理は必ず成功するようにチェックをつけておきましょう

もしくは計算に成功したか失敗したかの情報を返す(Get Random…のReturn ValueをSuccessピンに接続)のもありです
その場合は、シーケンスで呼び出された場合、次のMoveToには進みません

ではビヘイビアツリーにもどり今作ったタスクをつなぎましょう

移動する前に次に行く場所を計算したいのでここですね

さきほど目玉を開いたキー変数がここで選択できるのでターゲットロケーションに変更しましょう

これで5番でランダムな位置が黒板に書き込まれ、それを参照する6番のMoveToが動きます。
位置を求めて移動して休憩の連続処理が定義できました

まだ左側のターゲットアクタを誰も設定していないので追いかける処理は常に失敗して巡回側だけが動く想定ですが、実際そうなるか確認しましょう

その前に大事な準備がまだあります

AIの移動(MoveTo)に必要なナビメッシュ

AIが移動できるエリア情報を定義していませんね

ナビリンクの動画の時と同じくナビメッシュバウンズボリュームを置きましょう
移動させたいエリアを囲うように広げましょう

よっしー
よっしー

あまり大きくしすぎると計算コストが増えるそうなのでバランスが必要だったりもしますがまぁそんなことは後で困ってから考えればよいでしょう

pキーで歩ける床面が緑色になるようにしましょう。

ビヘイビアツリーの使用

ビヘイビアツリーは作っただけで呼び出されていません。AIコントローラから実行してあげる必要があります

BP_AI > イベントグラフ

BeginPlayからRun Behavior Tree をつなぎましょう

BTAsset欄にビヘイビアツリー BT_AIを設定します

この状態でシミュレーション実行すると、BT_AI編集画面で、いまどこが動いているか光って教えてくれるようになりました

一瞬左の②MoveToまで実行されていて、それが必ず失敗するので③5秒待つことはなく、④巡回側の処理が動いていますね

よく見ると歩き方が気持ち悪いですが動画で紹介した件ですね
これはサクッと修正しましょう

CBP_AI
キャラクタームーブメントコンポーネントの詳細欄 Use Acceleration for Paths にチェックです

よっしー
よっしー

UE5.4のときはここ触らなくてもちゃんと動いていました。
もともとチェックついていた?何か変更意図ありますかね?

できましたね

よっしー
よっしー

ここまでわかればあなたもりっぱなプログラマです(^ー^* )フフ♪

コメント

タイトルとURLをコピーしました