【Unity】Behavior Designerの4種類のTaskを理解して基本的な使い方を学ぶ

Behavior Designerの4種類のTaskを理解することで基本的な使い方を学んでみます。

Behavior Designerとは?

Behavior DesignerはUnityでBehavior Treeを扱うためのアセットです。

assetstore.unity.com

これを使うと簡単にBehavior Treeがビジュアルスクリプティングで構築できます。
そしてこのBehavior Designerには4種類の「Task」が存在します。

  • Action Task
  • Composite Task
  • Conditional Task
  • Decorator Task

この記事ではこれらの違いをまとめていきます。

Taskとは?

Behavior DesignerでBehavior Treeを組み立てる時、初期状態だと下図のようにルートだけが存在します。

f:id:halya_11:20190330180819p:plain

これに、試しにログを吐く処理をくっつけてみます。

f:id:halya_11:20190330181012p:plain

このBehavior Treeを実行すると、「Logged」というログが出力されます。
このような一つの処理単位をTaskと呼びます。

Action Task

前節のログ出力を行うタスクのようにツリーの末端で処理を行うTaskをAction Taskと総称します。

ログ出力の他にも、攻撃をしたり移動をしたり待機をしたり、といったTaskがあります。

Composite Task

前節のAction Taskの他に、Composite Taskというものがあります。
Composite Taskは、子として複数のTaskを接続できるTaskです。

例として、「子Taskをランダムに実行する」といったものがあります。

f:id:halya_11:20190330193145p:plain

上図の青いTaskがランダム実行のためのTaskです。

Composite Taskには他にも、「子Taskを順番に実行する」ものや、
「子タスクを同時に実行する」ものなどがあります。

Taskの成否

次節のConditional Taskの話をする前にTaskの状態について書きます。
Taskは実行されると、そのタスクが成功したか失敗したかを返します。

最初のログ出力の例の場合、ログ出力Taskが実行されると「成功」になります。

f:id:halya_11:20190330194107p:plain
ログ出力されると「成功」になる(上図の緑のチェック)

ここで、「二つのbool値を比較する」Taskを考えます。
このTaskはbool値が一致すれば「成功」、正しくなければ「失敗」になります。

f:id:halya_11:20190330194416p:plain
bool値が一致しないと「失敗」になる(上図の赤のチェック)

このようにTaskには成功、失敗があります。

Conditional Task

Conditional Taskとは、何かしらの条件判定を行ってその結果が成功か失敗かを返すTaskです。
実は、前節の「二つのbool値を比較する」TaskはConditional Taskの一つです。

もう少し実用的な使用例として、Selectorと併せて使う方法があります。
SelectorはComposite Taskの一つで、「子Taskのいずれかが成功するまで順番に実行する」Taskです。

これらを使って作ったBehavior Treeが下図です。

f:id:halya_11:20190330195807p:plain

これが実行されるとまず左側のBool Comparisonが判定され成否を返します。
もしこれが失敗した場合にはSelectorにより次の子TaskであるLogが実行され、「Failed」というログが出力されることになります。

f:id:halya_11:20190330195936p:plain

Conditional Taskはこのようにして使います。
他にもコライダーが衝突しているかをチェックするものや、GameObjectがアクティブかをチェックするものなどがあります。

Decorator Task

Taskの種類の最後の一つにDecorator Taskがあります。
これは、子タスクを一つだけ持ち、その実行方法を制御するTaskです。

例えば子タスクを指定した回数だけ実行するTaskがあります。

f:id:halya_11:20190330200759p:plain

上図の例では、Logが3回実行された終了します。

Repeaterの他にも、子が成功するまで繰り返すものだったり、
子の成功状態を反転するものなどがあります。

Taskの「実行中」状態

さてTaskには「成功」や「失敗」があるということを書きました。 実はTaskにはこのほかに「実行中」という状態があります。

例えば「一定時間何もせず待機する」Action Taskを考えます。

f:id:halya_11:20190330201128p:plain

このタスクは実行されると指定した時間だけ「実行中」状態になります。

f:id:halya_11:20190330201155p:plain
緑は「実行中」

そして一定時間経過したら「成功」となります。

f:id:halya_11:20190330201246p:plain

このようにTaskは「実行中」という状態も持ちます。

まとめ

以上、Behavior Designerで扱う4種類のTaskについてまとめました。
実際にはゲームに合わせてこれらのTaskを拡張し、AIなどを作っていくことになります。