Page 1 of 1

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

Posted: 2024/03/06 08:10
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();
}
}

問題個所をご教示いただけると助かります。

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

Posted: 2024/03/06 10:01
by caitsithware
ご利用ありがとうございます。

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

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

こういう状況ということで間違いないでしょうか?

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

Posted: 2024/03/06 10:43
by Boily
お返事ありがとうございます。
整理していただいた状況で間違いありません。

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

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

この発見から最初に質問に関する問題も同じような原因でツリーの探索がどこかで止まってしまっているなのではないかと考え始めたところです。
こちらについても何かご意見を伺えれば幸いです。

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

Posted: 2024/03/06 10:56
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についてはこれから再現確認をいたしますので少々お待ちください。

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

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

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

ほかに何か補足情報はありますか?

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

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

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

Posted: 2024/03/06 13:17
by caitsithware
詳細をありがとうございます。

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

暫定対処方法
  1. Parallel Selector直下の子ノードにはデコレータを使用せず、使用したい場合は子ノードの間にSelector単体を挟む。

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

Posted: 2024/03/06 14:14
by Boily
ご確認ありがとうございます。
ひとまず暫定処置にて不具合が解消されました。
この度はご対応ありがとうございました。