敵AIのBT構築時の不明点

Here is the forum to do the questions about how to use to Arbor developer.
Attention point:
  • We can not answer your questions about your project specific issues.
  • We can not answer your questions on Unity's specification issues.
  • Please check Arbor Documentation and ask a question if you still don't know how to use it. If the desired function is not described in the document, it is highly possible that the function does not exist from the beginning, so go to the request forum.

ここは、Arbor開発者へ使い方に関する質問を行うフォーラムです。
注意点:
  • ユーザー様のプロジェクトの仕様上の問題や設計に対する質問には答えられません。
  • Unityの仕様上の問題に対する質問には答えられません。
  • Arbor Documentationを確認の上、それでも使い方がわからない場合にご質問ください。欲しい機能の記載がドキュメントにない場合は機能が元から存在しない可能性が高いので要望フォーラムへ。

Forum rules
Here is the forum to do the questions about how to use to Arbor developer.
Attention point:
  • We can not answer your questions about your project specific issues.
  • We can not answer your questions on Unity's specification issues.
  • Please check Arbor Documentation and ask a question if you still don't know how to use it. If the desired function is not described in the document, it is highly possible that the function does not exist from the beginning, so go to the request forum.

ここは、Arbor開発者へ使い方に関する質問を行うフォーラムです。
注意点:
  • ユーザー様のプロジェクトの仕様上の問題や設計に対する質問には答えられません。
  • Unityの仕様上の問題に対する質問には答えられません。
  • Arbor Documentationを確認の上、それでも使い方がわからない場合にご質問ください。欲しい機能の記載がドキュメントにない場合は機能が元から存在しない可能性が高いので要望フォーラムへ。
momomo

敵AIのBT構築時の不明点

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

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

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

Post by momomo »

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

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

Post 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. ビヘイビアツリーは「優先度が高い方から低い方に向かって順番に条件判定や行動していく、優先度が高いほど条件次第で割り込んで行動させる」というのが基本なので、それが理解できていれば基本的な考え方は問題ないかと思います。
    重複個所については、デコレータの条件次第で纏められないか、同一行動を起こす条件に合致するデコレータスクリプトを自作したほうが良さそうか、などもご一考してみてください。
以上となります。
最初にも書きました通り、これが唯一の正解というわけではありません。
あくまで参考程度とお考え下さい。
momomo

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

Post by momomo »

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