Page 1 of 1

ServiceとActionBehaviorの違いについて

Posted: 2023/07/19 13:41
by Keitaro
非常に基礎的な質問で申し訳ないのですが、BehaviorTreeにおけるServiceとActionBehaviorの違いがドキュメントを読んでも、実際に動かしてみてもよくわかりませんでした。
用途や挙動にどういった違いがあるのか、簡潔にご説明いただけるとありがたいです。

すいませんが、よろしくお願いいたします。

Re: ServiceとActionBehaviorの違いについて

Posted: 2023/07/19 23:32
by caitsithware
ServiceとActionBehaviourの違いについてですね。

主な違いは以下の通りです。

ActionBehaviour
  • アクションノード(いわゆるツリー構造のリーフ部分)でのみ使用可能。
  • 1アクションノードに必ず一つだけActionBehaviourが必要。
  • FinishExecuteメソッドを使用するとノードの実行を終了し親ノードに結果を返すことができる。
Service
  • アクションノードとコンポジットノードのどちらでも使用可能。
  • Serviceを追加しているノードがアクティブである間実行され続ける(コンポジットノードに設定した場合は、子ノードが実行中の間も実行される)
  • Serviceはノードに0個以上の複数個追加できる。
  • ノードの実行結果に直接作用させることができない(FinishExecuteメソッドが使えない。パラメータやデータ出力を介して間接的に他ノードの挙動を変えることはできる)

例えばステルスゲームの敵がプレイヤーを見つけて追いかける例を考えてみます。
  • 追跡アクション : 「パラメータ:攻撃対象の位置」まで移動する。移動完了したら成功を返す。
    移動中に「パラメータ:対象発見フラグ」がオフなら(つまり見失ったら)失敗を返す。
  • 対象監視サービス : 一連の追跡行動を行うSequencerコンポジットノードに追加する。
    攻撃対象を監視し、自オブジェクトから対象が見えている限り「パラメータ:攻撃対象の位置」を更新する。
    攻撃対象が見えなくなったら「パラメータ:対象発見フラグ」をオフにする。
このような感じです。
この例はあくまで一例で、ゲームの規模によってはActionBehaviourとServiceを分ける必要性がない場合もあると思います。
これ以外の用途でも使える場面はあると思いますので、いろいろ試してみてください。