はじめに
この記事はHamster Output Advent Calendar 2024の12日目の記事です!
今回、Arbor3のステートマシンを利用している時にAnimatorのAnyStateのようなステートの強制遷移ができるのかと疑問がでたので、調べたことを書きます。
参考にしたリンク
結論
・スクリプトから強制ステート遷移するなら
ArborFSMを参照 → StateLink変数を作成してArborFSMのFindStateメソッドでステートを取得 → ArborFSMのTransitionメソッドの引き数にStateLinkを渡す
・ArborEditorから強制ステート遷移するなら
ResidentStateを作り遷移条件を作成する
現時点で自分が知っている方法はこの辺り...下の方でもう少しだけ詳細に手順を書いていきます
スクリプトから強制ステート遷移
先ほどの内容をソースコードにするとこんな感じです。Findなので、名前間違いやステートが存在しない場合エラーになるので注意。
using Arbor;
using UnityEngine;
public class Test : MonoBehaviour
{
[SerializeField]
private ArborFSM _arborFSM;
private State _anyState;
private void Start()
{
// ステートを取得
_anyState = _arborFSM.FindState("Idle");
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
// ステートの遷移
_arborFSM.Transition(_anyState);
}
}
}
ArborEditorから強制ステート遷移するなら
Residentは常駐という意味です。ArborEditor上でもResidentに追加した処理や条件が達成するとResidentに強制ステート遷移ができます。
作り方はとても簡単で、ArborEditor上で右クリックを押してResidentStateを作成
ResidentStateに遷移条件を追加する...これだけです。
使うならどっちが良いか
簡単な強制ステート遷移ならResidentState。強制ステート遷移だけど、連続で呼ばれたくなかったり調整をしたいならスクリプトから強制ステート遷移を作成する。