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