Page 1 of 1

previousStateにつきまして

Posted: 2020/03/18 13:39
by misokatsu
こんにちは。大変お世話になっております。
Arborを使っております。

要件: 前の状態に楽に遷移したい

解決策1: Transition(previousState)
問題点: Transitionを通してメンバーのPreviousStateに遷移してしまうと、現状の状態が再度PreviousStateになってしまい、Transition(previousState)を繰り返すことでずっと前に戻るわけではなく二つのステートを行ったり来たりすることになってしまいました。

解決策2: 別途のStateLinkを貼って強制的に遷移させる
問題点: 複数のステートから現状のステートに遷移した際は、それぞれのステートに戻す処理が手間がかかってしまいます。

一応スクリプトに手を加えればなんとかなりそうな気はしているのですが、他の解決策があれば教えて頂けると助かります。

Re: previousStateにつきまして

Posted: 2020/03/19 00:09
by caitsithware
misokatsu wrote: 2020/03/18 13:39 解決策1: Transition(previousState)
問題点: Transitionを通してメンバーのPreviousStateに遷移してしまうと、現状の状態が再度PreviousStateになってしまい、Transition(previousState)を繰り返すことでずっと前に戻るわけではなく二つのステートを行ったり来たりすることになってしまいました。
厳密にいえば仕様となります。
Transition(previousState)の呼び出し箇所や、前の状態の遷移条件をもう一度確認してみてください。
  • 無条件にTransition(previousState)を呼び出して前の状態に遷移するようするよう作られている
  • 前の状態でも無条件にGoToTransitionなどで遷移するように作られている
上記で、二つのステートを行ったり来たりする挙動になってしまいます。


検証内容
一つ前の状態に戻るだけの動作については、以下のコードやグラフで検証しましたので、参考にしてみてください。

●検証環境
・Windows 10
・Unity 2019.3.3f1
・Arbor 3.6.9

●BackToPrevStateBehaviour.cs

Code: Select all

using UnityEngine;
using Arbor;

[AddComponentMenu("")]
public class BackToPrevStateBehaviour : StateBehaviour 
{
	public override void OnStateBegin() 
	{
		State prevState = prevTransitionState;
		if (prevState != null)
		{
			Transition(prevState);
		}
	}
}
●ArborFSM
Transition_PreviousState_FSM.png
Transition_PreviousState_FSM.png (90.1 KiB) Viewed 3809 times
●動作中GIF
Transition_PreviousState.gif
Transition_PreviousState.gif (1.97 MiB) Viewed 3809 times

「前の前に戻る」
またprevTransitionStateを使って「前の前に戻る」といった動作は想定外であり実現できません。
こちらについては以下の方法を参考にしてみてください。
  • 提案1: ご提示いただいた解決策2で一時的に対処する
  • 提案2:戻り先のステートの名前で遷移する

    Code: Select all

    Transition(stateMachine.FindState("名前"))// 簡易に記述したため、nullチェックなどは別途行ってください。
    (グラフ見るだけでは遷移が追えなくなるなどの問題もあるのでご注意を)
  • 提案3:グラフの階層化を用いて「グラフの下位へ進む/上位へ戻る」という考え方で進む/戻るグラフを作る。
    グラフの階層化
    ※例:「EndStateMachineのSuccessがtrueなら、上位グラフに戻った後さらにEndStateMachineで戻る」などとすれば前の前に戻れる。