Page 1 of 1

敵AIのBT構築時の不明点

Posted: 2021/12/07 10:16
by momomo
お世話になります。
敵AIを作成しているのですが、分からないところがあり、質問をお願いいたします。

下記の簡単な敵AIを作成しています。
・指定距離内にプレイヤが入ると近づいて、近接攻撃してくる。
・プレイヤから攻撃を受けると近づいて、近接攻撃してくる。

上記の条件をもとに、このようなグラフを作成しました。(リンク開くと画像が大きくなります。すみません。)
https://dotup.org/uploda/dotup.org2665237.jpg
Image

真ん中5(右上の番号)の列が「指定距離内にプレイヤが入ると近づいて~」でして、
左端2の列が「プレイヤから攻撃を受けると近づいて~」でして、
G列のはどの条件も満たない場合となり、待機状態としています。
近接攻撃処理は仮でWaitアクションを置いています。

下記の質問をお願いいたします。
1.左端2の攻撃を受けたときの処理についてなのですが、敵から攻撃を受けたら(2)、指定時間プレイヤへ移動した後(3)、
  プレイヤとの距離を見て近づくか中断するか(5)、という処理にしたいと考えました。
  そこで、3にTimeLimitデコレータを付与したのですが、TimeLimitが失敗を返すと、親がSequencerなので、
  右に流れず想定した結果となりません。
  一方、EnemyMoveToPlayerのStopOnEndを満たせば、右に流れるので問題ありません。
  これはどのように解決するのがよさそうでしょうか。

2.5,6,7と、9,10,11が全く同じなのですが、重複箇所を共通化できる方法はありますでしょうか。
  例えば5, 9にSubBehaviourTreeを置いて、それぞれが同一の子階層を参照する、等はできますでしょうか。

3.ビヘイビアツリーを知ってからまだ間もなく、考え方的に合っていますでしょうか。
  とくに重複箇所が気になってしまいしっくりきていません…

お忙しいところ恐縮ですがよろしくお願いいたします。

Re: 敵AIのBT構築時の不明点

Posted: 2021/12/07 10:30
by momomo
すみません、追記です。
そこで、3にTimeLimitデコレータを付与したのですが、TimeLimitが失敗を返すと、親がSequencerなので、
右に流れず想定した結果となりません。
指定時間終了後に想定する結果は、
右のWaitアクション(=近接攻撃)をスキップして、5の処理へいく感じです。
単純に右に行ってしまうと、プレイヤと接近していないのに近接攻撃アクションを取ることになり、
それは想定した形ではありません。
長々とすみません。

Re: 敵AIのBT構築時の不明点

Posted: 2021/12/07 11:38
by caitsithware
ご利用ありがとうございます。

敵AIのビヘイビアツリーについてですね。
組み方については様々考えられますので、あくまで参考程度に私の考えをお答えしたいと思います。
  1. 以下の方法が考えられます。
    1. Sequencer(2)の下にコンポジットノードのSelectorを追加。
    2. そのSelectorにSetResultデコレータを追加し、Resultにチェックを入れる。
    3. EnemyMoveToPlayer(3)、Wait(4)を追加したSelectorの子に設定。
    簡単に説明しますと、親がSequencerで子の中の途中だけを飛ばしたい場合はSelectorを間に挟みつつSetResultで親には影響を与えないようにする感じです。
    (SetResultで強制的に設定したくないケースは複雑になるためここでは割愛します)
  2. 全く同じBehaviourTreeを共有する場合は、SubBehaviourTreeReferenceが利用できます。
    共有したいBehaviourTreeを別途シーン内(同一GameObject内でもOK)に作成しておき、External BTに設定、Use Directly In Sceneをチェックで、共有して使用されるようになります。
    ただし、グラフが分断されてしまうため、もし共有して参照したいパラメータがある場合はGameObjectへ直接ParameterContianerを追加して共有して参照するか、値をその都度受け渡す必要がある点はご注意ください。
  3. ビヘイビアツリーは「優先度が高い方から低い方に向かって順番に条件判定や行動していく、優先度が高いほど条件次第で割り込んで行動させる」というのが基本なので、それが理解できていれば基本的な考え方は問題ないかと思います。
    重複個所については、デコレータの条件次第で纏められないか、同一行動を起こす条件に合致するデコレータスクリプトを自作したほうが良さそうか、などもご一考してみてください。
以上となります。
最初にも書きました通り、これが唯一の正解というわけではありません。
あくまで参考程度とお考え下さい。

Re: 敵AIのBT構築時の不明点

Posted: 2021/12/07 17:17
by momomo
迅速にご返信いただきまして、誠にありがとうございます。
また、丁寧に解説いただき、大変参考になりました。
短文で恐縮なのですが、重ねてお礼申し上げます。