ビヘイビアベースAI
■概要
ビヘイビアベースはNPCの行動レベルで動作を考えるAI手法で、 最も使用されている手法は「ビヘイビアツリー」と呼ばれる方法です。 ●行動 ビヘイビアベースにおける行動はアクションゲームにおける 時間がかかる挙動を示しており、「●●まで移動する」 「○○の方向を向く」「△△に向かって攻撃する」などです。 RPGなどのターン制のゲームも「物理攻撃」「魔法攻撃」なども ビヘイビアにおける行動と考えることができます。 ●ビヘイビアツリー ビヘイビアツリーは行動のルートとなる行動から木構造的に 行動が分かれていき、最終的に末端の行動を実行する方法です。上の図の末端の赤枠が実行される行動です。 最初のルートから始まり、各ノード毎に次のノードを選択しながら、 最終的に赤枠にノードにたどり着くようになっています。 ●ステートベースとの違い ステートベースは「状態」、ビヘイビアベースは「行動」と分かれていますが 実装する上では意味が変わらないように思えます。 この二つのAIの違いは以下の通りです。 ・巡回するかしないか ステートベースは状態を遷移し続けるので必ず次の状態に 遷移するための状態が決まっているので、状態の終端はなく巡回を続けます。 一方、ビヘイビアベースは木構造の末端が実行処理になり、 行動が終了したらルートに戻るので基本的には巡回しません。 ・管理がしやすい ステートでは状態の遷移が多方に拡散していますが、 ビヘイビアはルートから一方通行で伸びていくので 図としても見やすく管理がしやすくなっています。 ●サンプル ビヘイビアベースのサンプルコード用意していますので参考までにどうぞ。 ・リンク サンプル ・言語 C++ ・環境 VisualStudio2015 ・内容 ビヘイビアは基本的なノードの選択方法はありますが、処理の仕様は多数あります。 今回のサンプルはUE4が提供しているビヘイビアツリーとは仕様が異なります。 「木構造」「葉の行動を実行する」「行動が終了したらルートに戻る」など 基本的な決まりごとはありますが、実装する人によって内容が異なります。
■ノードの選択
ビヘイビアはルートノードから子ノードを辿っていきますが、ノードを辿る際に「1つの共通処理」と 「5つの選択処理」によってどのノードを選択するかを決めます。 ※選択方法はあくまで有名なものを紹介しています。 ゲームの仕様によって選択方法も様々ですので、これだけしかないという 固定概念にとらわれないようにして下さい。 ●共通処理 ノード実行の共通処理としてどのモードを使用する場合でも 事前にノードが選択可能かどうか判定をします。 例えば「防御ノードはHPが50%以下かつ40%で選択される」仕様の場合 HPの割合と40%の抽選に当選したかを判断して、 条件に当てはまっていれば選択可能、当てはまっていなければ選択不可とします。 ●優先度リスト法 優先度リスト法は各ノードに優先順位がつけられており、 実行可能なノードの中から最も優先順位の高いノードを実行する手法です。 子ノードの先頭から優先順位が高い順とする方法と優先順位の値をノードに 設定する方法があります。 ●確率的法 確率的法は実行可能なノードからランダムにノードを選択する手法です。 ●オン・オフ法 オン・オフ法は実行可能なノードからまだ実行していないノードを選択する手法です。 ●シーケンス法 シーケンス法は子ノードを上から順番に実行していく方法です。 子ノードが末端に至ったらルートに戻ります。 ●シーケエンシャル・ルーピング法 シーケエンシャル・ルーピング法はループするシーケンス法です。 シーケンスのノードが末端に至ったらノードの先頭に戻ってノードを実行します。 ●シーケンス法について シーケンス法では行動失敗に終わったり、順番に実行できなかった場合は ルートに戻るという方法がとられていることが多いです。
■ノード実行
ノード選択が終了し、末端のノードに行き着いたらそのノードに設定されている 行動が実行されますが、この行動の情報を取得できるようにしておいたら その後の管理が楽になります。 ●行動の情報の例 ・実行中 ノードで設定されている行動を実行している状態です。 ・行動成功 ノードで設定されている行動が無事終了した状態です。 ・行動失敗 ノードで設定されている行動が失敗に終わった状態です。 最低限必要な情報は上にあげているように実行中かどうかと 終了した場合に成功したかどうかが必要です。 実行中かどうかは終了したら次の行動を決めるためにルートに戻る際に必要です。 行動の成否はシーケンス法やシーケンシャルルーピング法で使用します。 シーケンス法では途中の行動が成功したら次の行動に移動して 失敗したらルートに戻るという仕様になっているケースが多いです。 なので、きちんと行動の成否が分かるようにしてスムーズに判断できるようにします。
上の図の末端の赤枠が実行される行動です。
最初のルートから始まり、各ノード毎に次のノードを選択しながら、
最終的に赤枠にノードにたどり着くようになっています。
●ステートベースとの違い
ステートベースは「状態」、ビヘイビアベースは「行動」と分かれていますが
実装する上では意味が変わらないように思えます。
この二つのAIの違いは以下の通りです。
・巡回するかしないか
ステートベースは状態を遷移し続けるので必ず次の状態に
遷移するための状態が決まっているので、状態の終端はなく巡回を続けます。
一方、ビヘイビアベースは木構造の末端が実行処理になり、
行動が終了したらルートに戻るので基本的には巡回しません。
・管理がしやすい
ステートでは状態の遷移が多方に拡散していますが、
ビヘイビアはルートから一方通行で伸びていくので
図としても見やすく管理がしやすくなっています。
●サンプル
ビヘイビアベースのサンプルコード用意していますので参考までにどうぞ。
・リンク
