UniTaskに対応したStateMachine、UniTaskStateMachineを公開しました!


はじめに

UniTaskを利用することで、コールバックを減らしコードの可読性が上がり様々な恩恵を受けてきました。
しかし、RecycleScrollViewやStateMachine、BehaviorTreeなどAPIの戻り値がUniTaskになっていないサードパーティーのパッケージがほとんどです。
そこで今回はStateMachineを対応してみようと思い、UniTaskStateMachineを実装しました。

何が便利なのか?

OnEnter,OnUpdate,OnExitの戻り値がUniTask

StateMachineの詳細な説明は省きますが、以下のように戻り値がUniTaskで引数でCancellationTokenを渡すようにしています。

public interface IState
{
    UniTask OnEnter(CancellationToken ct = default);
    UniTask OnUpdate(CancellationToken ct = default);
    UniTask OnExit(CancellationToken ct = default);
}

例えばOnEnter内で非同期の初期化処理が必要になった時に、awaitをかければ処理が終了するまでOnUpdateが呼ばれなくなります。
OnUpdateでawaitをかけると次のフレームが来てもOnUpdateが前回の処理が終了するまで呼ばれることがありません。
OnExitでawaitをかけると処理が終了するまで次のステートに遷移しません。

このようにすることで戻り値がvoidの時と比べ、フラグ管理や呼び出し順に頭を抱える必要がなくなると私は感じています。

ベースの実装は以下の階層のファイルだけで完結できるので仕組みはシンプルです。

StateMachineEditor付属

しかし、それだけではパッケージとしての特色が少ないので、合わせてStateMachineEditorも実装しました。(こちらの方が実装大変)

コード上でステートの遷移を実装すると各ステートの繋がりが分かりにくいので、把握に時間がかかったり不具合の原因にもなります。
グラフで遷移を視覚的に確認できるとそういった煩わしい時間を減らすことができると感じています。
またプレイ中には現在実行中のステートを確認することも可能です。

UniTaskStateMachine

インストール

3通りのインストール方法を提供しています。
また、UniTaskはパッケージ内に含まれていないので本家様からのインストールが必要です。

GitHub経由でインストール(PackageManager)

Window/Package Managerを開き、add package from git URL...で以下を入力して追加してください。

https://github.com/k-okawa/UniTaskStateMachine.git?path=Assets/Bg/UniTaskStateMachine

OpenUPM経由でインストール(PackageManager)

openupm add com.bg.unitaskstatemachine

UnityPackageを展開してインストール

リリースページからダウンロード可能です。

使い方

今回の記事では詳細な使い方は説明しないので、詳細はREADMEをご参照ください。

最後に

UniTaskStateMachineが初めて公開したオープンソースパッケージになりますので、私の発想が便利で役立つものになっているか・そもそも思想が間違っていないか心配なところはありますが、是非使っていただけると嬉しいです!