非同期処理を持つActionBehaviourとSubBehavourTreeのRestartOnFinishに関する不具合

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を確認の上、それでも使い方がわからない場合にご質問ください。欲しい機能の記載がドキュメントにない場合は機能が元から存在しない可能性が高いので要望フォーラムへ。
Boily
Posts: 7
Joined: 2024/03/06 07:48

非同期処理を持つActionBehaviourとSubBehavourTreeのRestartOnFinishに関する不具合

Post by Boily »

unity ver 2022.3.19f1
arbor3 ver 3.10.0

Arbor3にお世話になっております。
fsmとbehaviour treeをネストしてAI作成を試みています。
ツリーには非同期処理を実装した独自のActionBehaviourを使用しています。
ツリー単体ではアクションを実行した後、ツリーが再開し次のアクションに移行しますので問題ありません。
しかし、fsmの内部にこのツリーをサブツリーとして導入した時、ツリーが一度だけ実行されその後再開されない現象が発生しています。
FSM側のSubBehaviourTreeの設定ではRestartOnFinishのフラグにチェックが入っています。

以下カスタムアクションのスクリプトです。
こちらはランダムな間隔でランダムなテキストを表示するためのアクションです。

using System.Collections.Generic;
using System.Threading;
using Arbor;
using Arbor.BehaviourTree;
using Cysharp.Threading.Tasks;
using UnityEngine;

public class SB_Speech : ActionBehaviour
{
[SerializeField] InputSlot<ISpeechable> speecherSlot = new();
[SerializeField] bool speechOnEnter = false;
[SerializeField] bool autoSpeech = false;
[SerializeField] List<string> texts = new();
ISpeechable speecher;
public string GetRandomText(){
return texts[Random.Range(0, texts.Count)];
}
const float MIN_INTERVAL = 5f;
const float MAX_INTERVAL = 10f;
float interval = 0;
void InitAutoSpeechTimer(){
interval = Random.Range(MIN_INTERVAL, MAX_INTERVAL);
}
bool isDone = false;
CancellationTokenSource source;
protected async override void OnStart()
{
source = new();
isDone = false;
speecherSlot.TryGetValue(out speecher);
if(speechOnEnter){
speecher.SpeechBase.Speech(GetRandomText());
}
if(autoSpeech){
InitAutoSpeechTimer();
try
{
await UniTask.WaitForSeconds(interval, cancellationToken: source.Token);
speecher.SpeechBase.Speech(GetRandomText());
}
catch (System.Exception)
{

}
}
isDone = true;
}
protected override void OnExecute()
{
if(isDone) FinishExecute(true);
}
protected override void OnEnd()
{
source.Cancel();
}
}

問題個所をご教示いただけると助かります。
User avatar
caitsithware
管理人
Posts: 493
Joined: 2015/08/17 12:41

Re: 非同期処理を持つActionBehaviourとSubBehavourTreeのRestartOnFinishに関する不具合

Post by caitsithware »

ご利用ありがとうございます。

問題となっている状況について一度整理いたします。

グラフの構成
  • ArboFSMにSubBehaviourTreeを作成。
  • ArborFSMのSubBehaviourTreeのSuccess Link、Failure Linkは接続せず、Restart On Finishにチェックが入っている。
  • 子ビヘイビアツリーで何かしら処理。
実行時
  1. ArborFSMのSubBehaviourTreeが実行開始。
  2. 子ビヘイビアツリーの処理が一通り実行されルートに結果が返り完了となる。
  3. SubBehaviourTreeのRestart On Finishにチェックが入っているにもかかわらず、子ビヘイビアツリーが再スタートしない。
※BehaviourTreeコンポーネントで同様のビヘイビアツリーの処理を作った場合は、ルートに結果が返った際に繰り返し再スタートされる。

こういう状況ということで間違いないでしょうか?
Boily
Posts: 7
Joined: 2024/03/06 07:48

Re: 非同期処理を持つActionBehaviourとSubBehavourTreeのRestartOnFinishに関する不具合

Post by Boily »

お返事ありがとうございます。
整理していただいた状況で間違いありません。

また、もしかすると関係があるかもしれないことを発見したので追記をします。
先ほどparalell selector, parallel sequencerの挙動を知るためにテスト用のツリーを作成したのですが、
parallel selectorの子ノードが一旦全て失敗になるとparallel selectorがアクティブな状態でツリーが固まってしまいました。
その後子ノードのdecoratorを成功判定に戻したとしてもツリーは停止したままでした。
parallel selectorより優先度の低いノードを作成し、そちらに判定を逃がそうと試みましたがそれも効果がありませんでした。

そこで、parallel slectorより優先度の高いノードを作成しそちらを成功させると固まっていた状況が再び動き出しました。
ビヘイビアツリーそのものについて浅学の身ですが、これはArbor3固有の仕様またはバグでしょうか?それともビヘイビアツリー自体がそういうものなのでしょうか?

この発見から最初に質問に関する問題も同じような原因でツリーの探索がどこかで止まってしまっているなのではないかと考え始めたところです。
こちらについても何かご意見を伺えれば幸いです。
User avatar
caitsithware
管理人
Posts: 493
Joined: 2015/08/17 12:41

Re: 非同期処理を持つActionBehaviourとSubBehavourTreeのRestartOnFinishに関する不具合

Post by caitsithware »

ご確認ありがとうございます。

SubBehaviourTreeのRestart On Finishが機能しない件については不具合ですので修正いたします。

暫定対処方法
  1. "Assets/Plugins/Arbor/BuiltInBehaviours/Scripts/Behaviours/BehaviourTree/SubBehaviourTree.cs"をコードエディタで開く。
  2. 225行目から229行目まで(以下の部分)を削除する

    Code: Select all

    if (_BehaviourTree != null)
    {
    	_BehaviourTree.Stop();
    	_BehaviourTree.enabled = false;
    }
    
paralell selectorについてはこれから再現確認をいたしますので少々お待ちください。
User avatar
caitsithware
管理人
Posts: 493
Joined: 2015/08/17 12:41

Re: 非同期処理を持つActionBehaviourとSubBehavourTreeのRestartOnFinishに関する不具合

Post by caitsithware »

Parallel Selectorの子ノードが一旦全て失敗になるとParallel Selectorがアクティブな状態でツリーが固まる件については再現確認できませんでした。

確認したビヘイビアツリーは以下の画像の通りです。
ParallelSelector.png
ParallelSelector.png (146.38 KiB) Viewed 659 times
子ノードのすべてがアクティブになり次第すぐに失敗を返し、Parallel Selectorからルートまでの組み方によりParallel Selectorがすぐに再実行されるような場合であれば、アクティブな状態でツリーが固まっているように見える状況になる可能性はあります。
この場合は仕様通りの動作ですので問題ありません。

ほかに何か補足情報はありますか?
Boily
Posts: 7
Joined: 2024/03/06 07:48

Re: 非同期処理を持つActionBehaviourとSubBehavourTreeのRestartOnFinishに関する不具合

Post by Boily »

ご確認ありがとうございます。
私のテスト用ツリーはこのような状態です。
スクリーンショット 2024-03-06 211401.png
スクリーンショット 2024-03-06 211401.png (168.55 KiB) Viewed 658 times
判定にset resultを使用するのとcalculator checkを使用するのとで挙動が異なっているようです。
私のほうでset resultに差し替えたテストツリーを実行したところ問題なく動作しました。
User avatar
caitsithware
管理人
Posts: 493
Joined: 2015/08/17 12:41

Re: 非同期処理を持つActionBehaviourとSubBehavourTreeのRestartOnFinishに関する不具合

Post by caitsithware »

詳細をありがとうございます。

確認したところ、Parallel SelectorかParallel Sequencerの子ノード直下にCalculator Checkなどのノード実行判定用デコレータを設定しても正常に動作しない不具合が見つかりました。
詳細な問題の箇所を検証のうえ修正いたします。

暫定対処方法
  1. Parallel Selector直下の子ノードにはデコレータを使用せず、使用したい場合は子ノードの間にSelector単体を挟む。
Boily
Posts: 7
Joined: 2024/03/06 07:48

Re: 非同期処理を持つActionBehaviourとSubBehavourTreeのRestartOnFinishに関する不具合

Post by Boily »

ご確認ありがとうございます。
ひとまず暫定処置にて不具合が解消されました。
この度はご対応ありがとうございました。
Post Reply