ビヘイビアベースAI

■概要

ビヘイビアベースはNPCの行動レベルで動作を考えるAI手法で、
最も使用されている手法は「ビヘイビアツリー」と呼ばれる方法です。

●行動
	ビヘイビアベースにおける行動はアクションゲームにおける
	時間がかかる挙動を示しており、「●●まで移動する」
	「○○の方向を向く」「△△に向かって攻撃する」などです。
	RPGなどのターン制のゲームも「物理攻撃」「魔法攻撃」なども
	ビヘイビアにおける行動と考えることができます。

●ビヘイビアツリー
	ビヘイビアツリーは行動のルートとなる行動から木構造的に
	行動が分かれていき、最終的に末端の行動を実行する方法です。

	game_ai_0005
	game_ai_0005

	上の図の末端の赤枠が実行される行動です。
	最初のルートから始まり、各ノード毎に次のノードを選択しながら、
	最終的に赤枠にノードにたどり着くようになっています。

●ステートベースとの違い
	ステートベースは「状態」、ビヘイビアベースは「行動」と分かれていますが
	実装する上では意味が変わらないように思えます。
	この二つのAIの違いは以下の通りです。

	・巡回するかしないか
		ステートベースは状態を遷移し続けるので必ず次の状態に
		遷移するための状態が決まっているので、状態の終端はなく巡回を続けます。
		一方、ビヘイビアベースは木構造の末端が実行処理になり、
		行動が終了したらルートに戻るので基本的には巡回しません。

	・管理がしやすい
		ステートでは状態の遷移が多方に拡散していますが、
		ビヘイビアはルートから一方通行で伸びていくので
		図としても見やすく管理がしやすくなっています。

●サンプル
	ビヘイビアベースのサンプルコード用意していますので参考までにどうぞ。

	・リンク
		サンプル

	・言語
		C++

	・環境
		VisualStudio2015

	・内容
		ビヘイビアは基本的なノードの選択方法はありますが、処理の仕様は多数あります。
		今回のサンプルはUE4が提供しているビヘイビアツリーとは仕様が異なります。
		「木構造」「葉の行動を実行する」「行動が終了したらルートに戻る」など
		基本的な決まりごとはありますが、実装する人によって内容が異なります。

■ノードの選択

ビヘイビアはルートノードから子ノードを辿っていきますが、ノードを辿る際に「1つの共通処理」と
「5つの選択処理」によってどのノードを選択するかを決めます。
※選択方法はあくまで有名なものを紹介しています。
 ゲームの仕様によって選択方法も様々ですので、これだけしかないという
 固定概念にとらわれないようにして下さい。

●共通処理
	ノード実行の共通処理としてどのモードを使用する場合でも
	事前にノードが選択可能かどうか判定をします。
	例えば「防御ノードはHPが50%以下かつ40%で選択される」仕様の場合
	HPの割合と40%の抽選に当選したかを判断して、
	条件に当てはまっていれば選択可能、当てはまっていなければ選択不可とします。

●優先度リスト法
	優先度リスト法は各ノードに優先順位がつけられており、
	実行可能なノードの中から最も優先順位の高いノードを実行する手法です。
	子ノードの先頭から優先順位が高い順とする方法と優先順位の値をノードに
	設定する方法があります。

●確率的法
	確率的法は実行可能なノードからランダムにノードを選択する手法です。

●オン・オフ法
	オン・オフ法は実行可能なノードからまだ実行していないノードを選択する手法です。

●シーケンス法
	シーケンス法は子ノードを上から順番に実行していく方法です。
	子ノードが末端に至ったらルートに戻ります。

●シーケエンシャル・ルーピング法
	シーケエンシャル・ルーピング法はループするシーケンス法です。
	シーケンスのノードが末端に至ったらノードの先頭に戻ってノードを実行します。

●シーケンス法について
	シーケンス法では行動失敗に終わったり、順番に実行できなかった場合は
	ルートに戻るという方法がとられていることが多いです。

■ノード実行

ノード選択が終了し、末端のノードに行き着いたらそのノードに設定されている
行動が実行されますが、この行動の情報を取得できるようにしておいたら
その後の管理が楽になります。

●行動の情報の例
	・実行中
		ノードで設定されている行動を実行している状態です。

	・行動成功
		ノードで設定されている行動が無事終了した状態です。

	・行動失敗
		ノードで設定されている行動が失敗に終わった状態です。

	最低限必要な情報は上にあげているように実行中かどうかと
	終了した場合に成功したかどうかが必要です。
	実行中かどうかは終了したら次の行動を決めるためにルートに戻る際に必要です。
	行動の成否はシーケンス法やシーケンシャルルーピング法で使用します。
	シーケンス法では途中の行動が成功したら次の行動に移動して
	失敗したらルートに戻るという仕様になっているケースが多いです。
	なので、きちんと行動の成否が分かるようにしてスムーズに判断できるようにします。