# ビヘイビアツリーとは？

ビヘイビアツリーは、挙動の優先順位や条件を明確にし制御しやすくするための木構造を言います。

Arborでは、BehaviourTreeコンポーネントをGameObjectに追加することで、ビヘイビアツリーが使えるようになります。

## 例: プレイヤーとの距離によって挙動が変わる敵

例えば、敵AIを考えてみましょう。

- 敵とプレイヤーとの距離が１０メートル以内なら近づく。
- それ以外の時は決まった経路を移動する。

プレイヤーに近づく挙動は決まった経路を移動する挙動に比べて優先度が高いと言えます。

ArborのBehaviourTreeで仮組すると以下のようになります。

左のノードほど優先度が高く、右に行くにつれ優先度が低くなります。
また、Decoratorと呼ばれるスクリプトをノードに追加することで条件判定を行い、実行するノードを制御しています。

詳しい解説は後程行います。

## ノードの構成要素

ビヘイビアツリーで使用するノードは以下のページにまとまっています。

ノードの構成要素

各部位の解説の前に、一度参照してください。

## 例の解説

では、先ほどの例をもう一度見てみましょう。

- まずルートノードからはじまります。
- Selectorノードにより、子ノードの成功ノードを探して左から順に実行していきます。
- Agent Move To Transformノードでは、ParameterCheckデコレータが追加されているため、Parameterを条件に判定が行われます。
- 例として、プレイヤーとの距離はDistanceパラメータに格納しているものと仮定して作成しています。
- 仮にDistanceが15だったとすると、ParameterCheckデコレータがfalseを返すため、Agent Move To Transformノードは失敗になり、Selectorに戻ります。
- SelectorはAgent Move To Transformノードが失敗したため、次のAgent Move On Waypointノードを実行します。
- Agent Move On Waypointアクションは、TypeがCycleになっているため中断などが起きない限り繰り返し実行し続けます。
- ここで、Distanceパラメータを10以下にしてみましょう。
- Agent Move To TransformノードのParameterCheckの条件に合致するため、現ノードを中断して割り込みします。
- 再びDistanceパラメータを10より大きくすると、Agent Move To Transformノードが中断されAgent Move On Waypointノードがアクティブになるのが確認できます。

  Distanceパラメータによってアクティブノードが変わる様子

このように、右に行くほど実行優先度が低くなり、また優先度が高いノードのDecoratorにより割り込みなどができるのがわかったかと思います。

今回のような簡単な例であれば有限ステートマシンでも特に複雑にならずに組めますが、
ステートの数が多く条件が複雑化しそうな場合ではビヘイビアツリーの方が、遷移線が交差することもなく実行ノード側に条件が記述できるためメンテナンスしやすい状態遷移が組めるようになります。