previousStateにつきまして

ここは、Arbor開発者へ使い方に関する質問を行うフォーラムです。
注意点:
  • ユーザー様のプロジェクトの仕様上の問題や設計に対する質問には答えられません。
  • Unityの仕様上の問題に対する質問には答えられません。

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.

Forum rules
注意点:
  • ユーザー様のプロジェクトの仕様上の問題や設計に対する質問には答えられません。
  • Unityの仕様上の問題に対する質問には答えられません。

Attention point:
  • We can not answer your questions about your project specific issues.
  • We can not answer your questions on Unity's specification issues.
misokatsu

previousStateにつきまして

Post by misokatsu » 2020/03/18 13:39

こんにちは。大変お世話になっております。
Arborを使っております。

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

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

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

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

User avatar
caitsithware
管理人
Posts: 327
Joined: 2015/08/17 12:41

Re: previousStateにつきまして

Post by caitsithware » 2020/03/19 00:09

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 88 times
●動作中GIF
Transition_PreviousState.gif
Transition_PreviousState.gif (1.97 MiB) Viewed 88 times

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

    Code: Select all

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

Post Reply