Page 1 of 1

ビヘイビアデザイナーのAgentMoveOnWaypointについて

Posted: 2019/11/21 21:38
by fuminon37450057
Arbor3、初めてインポートして使ってみています。

敵をルートに沿って動かすために、ビヘイビアデザイナーとAgentMoveOnWaypointを使おうと思っています。

動かすことは出来ましたが、例えば任意のWaypointで1度別の処理を挟むことはできないのでしょうか。
最後のWaypointで少し止まってみたり、角のWaypointで1度後ろを振り返る等の処理を挟みたいのです。

デコレーターでWaypointのイベント等が参照できるのでしょうか。

リファレンスを読んでいますが分からなかったので質問させて頂きました。

よろしくお願いします。

Re: ビヘイビアデザイナーのAgentMoveOnWaypointについて

Posted: 2019/11/21 23:25
by caitsithware
ご使用ありがとうございます。

BehaviourTreeのAgentMoveOnWaypointで任意の地点で別のアクションを割り込みさせたい、ということですね。

BehaviourTreeでの割り込みは割り込みさせたいアクションノードやコンポジットノードにデコレータを付ける必要がありますが、
現状、AgentMoveOnWaypointの状態を見て割り込みさせる機能はございません。

案1
その代わりに、以下のような形ではいかがでしょうか。
  • Waypointで行いたいアクション(もしくは親のコンポジット)ノードに割り込み用デコレータを追加。
    デコレータの内容:
    • Waypointに近づいたら有効になって割り込みする。
    • 任意のアクションが終わったら、範囲外に出るまでDecoratorは有効にならず割り込みさせない。
      (これを入れないと、次のノードに移ったタイミングで範囲内判定が入り繰り返してしまうため)
  • ノードの優先順位(グラフで見ると左側が優先)は、(あれば攻撃→追跡→)任意の地点でのアクション→巡回、という感じ。
案2
あるいは、AgentMoveToTransformなどを使用して直接任意の場所に移動させてアクションを取らせる、というのも良いかもしれません。
  • 任意のアクションを行いたい地点はWaypointに含まない、もしくは終着点とする。
  • AgentMoveOnWaypointが終わったら、必要であれば任意のアクションを行いたい地点までAgentMoveToTransformなどで移動する。
  • 任意のアクションを行う。
  • 親のコンポジットノードをループさせておき、AgentMoveOnWaypointに戻る。
  • ノードの優先順位は、巡回→任意のアクション(この2アクションの親にループ系のDecoratorなどを付けて繰り返しさせる)
  • この方法でしたらデコレータによる複雑な割り込みもなく、グラフ構成はスッキリするかと思います。
※これら案は実際に動作検証していませんので、何か他の問題があるかもしれません。ご了承ください。

また、複雑な動作を組み込みスクリプトのみで作るのも限界があるので、スクリプトの自作もお勧めいたします。
スクリプトの自作について、詳しくはマニュアルをご覧ください。
スクリプティング | Arbor Documentation

補足:
念のための補足ですが、ビヘイビアデザイナーは他社さんのアセット名ですので、
ここではBehaviourTree(ビヘイビアツリー)という名前を憶えていただければと思います。
BehaviourTreeというのはAIなどで活用される木構造を指しており、固有のアセットを指す言葉ではないのでアセットによらずに使用できます。

Re: ビヘイビアデザイナーのAgentMoveOnWaypointについて

Posted: 2019/11/22 00:50
by fuminon37450057
迅速な返信ありがとうございます。

まずBehaviorTreeの名称について、失礼いたしました。
以後気をつけます。

そうでした、自作の処理群を色々組み合わせられるのが大きなメリットですよね。

behaviortreeのスクリプト作りを一度勉強してみますね。

ご提案、大変助かりました。
ありがとうございます。

Re: ビヘイビアデザイナーのAgentMoveOnWaypointについて

Posted: 2019/11/26 06:30
by fuminon37450057
度々申し訳ありません。
スクリーンショット 2019-11-26 15.17.41.png
スクリーンショット 2019-11-26 15.17.41.png (75.73 KiB) Viewed 6383 times
このようなツリーを組みました。
EnemytestActionはOnExecute()でWaitForSecondsを返すコルーチンをStartCoroutineするアクションです(ただ何もしないで待つだけの処理を想定)。
IsStopWaypointデコレータは登録したWaypointと自身の距離を測り、JudgementDistanceの数値以下になれば一度だけtrueを返し、範囲外ならfalseを返します。

この状態で再生すると、AgentMoveOnWaypointノードにしか行きません。
実際は最初だけEnemyTestActionが呼ばれますが、指定時間待つことなくOnAbort()で抜けてしまいます。
それ以降、IsStopWaypointデコレータがtrueを返してもEnemyTestActionのノードに来ることはありませんでした。

私の解釈違いがあるとは思うのですが、
・IsStopWaypointデコレータがtrueを返したらEnemytestActionが実行され(WaitForSecondsで数秒待つ)、終了後にAgentMoveOnWaypointノードに映る(IsStopWaypointは一度trueを返したら範囲外からでて再度範囲内になるまでtrueを返さないため)
・IsStopWaypointがtrueを返したらEnemytestActionが実行される

この繰り返しを行えるようにするには、どの部分がおかしいでしょうか。
知恵をお貸しいただけると助かります。
よろしくお願いいたします。

Re: ビヘイビアデザイナーのAgentMoveOnWaypointについて

Posted: 2019/11/26 07:00
by caitsithware
まず初めに。
フォーラムルールにある通り、ユーザー様プロジェクト固有の問題や設計に関して的確に回答するのも難しいため
作成されたスクリプトのデバッグなどについては原則行っておりません。
その点はご了承ください。

Arborのシステム上の話としては
  1. IsStopWaypointのAbort FlagsがEverythingになっているため、一度入った後にSelf判定も行う。
  2. 一度「Enemy Test Action」に入った後、Self判定を行うとfalseが返され失敗扱いで終了
  3. Selectorを経由し「Agent Move On Waypoint」に移行
となっているようです。

「Enemy Test Action」を割り込ませたい条件と終了させたい条件について整理して、Abort Flagsや判定方法について一度見直してみてください。

Abort Flagsについて詳しくはこちら
ビヘイビアツリー | Arbor Documentation

Re: ビヘイビアデザイナーのAgentMoveOnWaypointについて

Posted: 2019/11/26 07:11
by fuminon37450057
この質問だと確かにデバッグをお願いしていることになってしまいますね。
申し訳ありませんでした。

なるほど、私はどうやらAbortFlagsの解釈を間違えていたようです。
マニュアルをもう一度読み直してきます。

非常に助かりました。
ありがとうございます。