Page 1 of 1

BehaviourTree の SubStateMachine + デコレータについて②

Posted: 2018/08/13 03:54
by kudou
①とは別件のような気がするので二つにわけます

①の方で「デコレータの条件が合っていないときでもSubStateMachineReferenceの開始ステートの挙動のOnStateBeginやOnStateUpdateが1度実行され」という話をしていました。
その打開案として図2を作成しました。
●図2
Image
この図で条件が合っていないときにはSubStateMachineReferenceの開始ステートの挙動のOnStateBeginやOnStateUpdateが呼ばれなくなりました。
ですが、今度はunityがフリーズするときがでるようになりました。
タイミングとしては図2の③のSubStateMachineReferenceの「hello」が実行されているときです。
●図3
Image
主人公が村人に話しかけたときにデコレータの【Hello】がtrueになり、「hello」が実行されます。
「hello」の中(図3)の処理は下記のとおりです。
1、話しかけられた村人の頭上に吹き出しとテキストを表示
2、吹き出しは2秒ほど表示されるので非表示になるまで待機
3、吹き出しがきえたら【Hello】を false にする
「hello」実行中でも主人公は操作でき、話しかけつづける(【Hello】をtrueにする)ことができます。
フリーズするタイミングはシビアなのですが、3の【Hello】をfalseと主人公が話しかけて【Hello】をtrueにするタイミングが重なったときになっているように見えます。

上記の方法だと発生させるのが難しいので、他に発生させる方法がないか試したところ図4の状態で話しかけるとunityがフリーズしました。
●図4
Image
単純にデコレータの条件がtrueになるようにしてSelectorになにもつながないとフリーズするようです。
上記の図3のときと違う原因かもしれませんが、参考になればと思います。

Re: BehaviourTree の SubStateMachine + デコレータについて②

Posted: 2018/08/13 04:38
by caitsithware
質問内容としては、そのグラフをフリーズしないようにする方法についてでしょうか?

申し訳ありませんが、自作されているグラフの内容についてはプロジェクトを丸ごと見せていただかないと正確なサポートもできないため、基本的には自力での解決をお願いいたします。
(Arbor外スクリプトとのタイミングの問題などもあるかと思いますので)

図4については、条件合致後アクションがないので即失敗を返してノード③へ行くも割り込み条件が合致したままなため再度ノード②に戻るのを繰り返しているのかと思います。
Priorityが自分よりも低い場合に割り込むデコレータ、失敗を返した場合に次のノードを実行するSelector、アクションがないので失敗を返さざるを得ない状況、ということで仕様となります。

BehaviourTreeは1フレーム内でも条件が合致する限り何度でも割り込み判定を行う構造となっていますので、何度も実行されてフリーズされるような場合は条件を見直すようにお願いします。

Re: BehaviourTree の SubStateMachine + デコレータについて②

Posted: 2018/08/13 06:13
by kudou
ご返答ありがとうございます。
質問内容としては、そのグラフをフリーズしないようにする方法についてでしょうか?

申し訳ありませんが、自作されているグラフの内容についてはプロジェクトを丸ごと見せていただかないと正確なサポートもできないため、基本的には自力での解決をお願いいたします。
(Arbor外スクリプトとのタイミングの問題などもあるかと思いますので)
今まで使用していてunityがフリーズしたことがなかったので気が動転していたのかもしれません。
フリーズすると保存していなかったものが色々とやり直しになるので、なんとか原因をつきとめたくて質問にあげてしまいました。
今回のこの図は調べてもわかりそうになく、また前質問の「FSM側の開始ステートにGoToTransitionを挟む」で不要になったので破棄いたします。

図4の件についても理解いたしました。
このような図にならないように条件に気をつけます。