はじめに
Playmakerは標準アクションでStartCoroutineが実装されています。単体では使えず、IEnumeratorをMonoBehaviour側で実装して
それを呼び出すアクションとしてStartCoroutineアクションを使用します。
実装
私は複数の別オブジェクトのFSMで逐次実行したり、並列実行が必要だったので、この前のメモで
UniTaskを使ったカスタムアクションを実装しました。作り方のヒントもこのStartCoroutineアクションの実装から来ています。
さっそく、PlaymakerのStartCoroutineアクションを見ていきましょう。

これだけだと、よくわからないですね。
このアクションは、MonoBehaviour側で実装した(指定したコンポーネントにある)IEnumeratorを呼び出して実行します。
IEnumerator例:
using System.Collections;
using UnityEngine;
public class MyRoutine : MonoBehaviour
{
public IEnumerator FadeOut(float duration)
{
Debug.Log("Fade Start");
yield return new WaitForSeconds(duration);
Debug.Log("Fade End");
}
}指定した秒数だけ待って「Fade Start → (指定秒待ち) → Fade End」をログ出力するコルーチンです。

先ほどのMonoBehaviourをPlaymaker FSMと同じオブジェクトに貼りつけます(アクションからオブジェクトが参照できれば、どのオブジェクトでも問題ないです)。

IEnumeratorのメソッドの引数(1つしか設定できない)に値を渡して呼び出します。
[Log] [MyRoutine/<FadeOut>d__0] [MoveNext] [] [23:50:41.714] Fade Start
[Log] [MyRoutine/<FadeOut>d__0] [MoveNext] [] [23:50:43.894] Fade End実行した結果、IEnumeratorのメソッドが実行され開始~引数で指定した2.5秒後にyieldで次のフレームが実行されます。

非同期処理の本題。Start Coroutineアクションのあと次の処理を流す。ここではState 2でログを流します。
[Log] [MyRoutine/<FadeOut>d__0] [MoveNext] [] [00:01:24.245] Fade Start
[Log] [FsmLog] [AddEntry] [GameObject] [00:01:24.245] GameObject : FSM : State 2 : DebugLog : FSMステートで先に実行される
[Log] [MyRoutine/<FadeOut>d__0] [MoveNext] [] [00:01:28.590] Fade EndこのようにPlaymakerのフローとは別にIEnumeratorの処理が非同期で動いてくれているのがわかります。
StartCoroutineアクションはStartCoroutineのラッパーなので、期待通りの動きですね。
・時間を使う処理
・待つ処理
・フレームをまたぐ処理
・ロードや通信を待つ処理
・アニメ・エフェクト・移動・UI
・ゲームのフェーズ進行
・AI処理
・サーバー通信
も実装することも可能ですね。
Unityの非同期処理について
非同期処理がCPUのスレッド、task.runのように複数スレッドで動いているように見えるが
UnityのコルーチンやUniTaskもメインスレッド上で動く、フレーム分割処理だそうです。
なので、Playmakerで複数のFSM,waitやNextFrameを駆使すれば、原理はそれっぽい非同期処理にすることも可能。
一種の状態遷移スケジューラで動いているので、フレームサイクル内の協調型タスクってFSMみたいなものなんですね。
※実装詳細まで見れてないので、要調査メモ。
まとめ
PlaymakerのStartCoroutineアクションは、
C#に書かれたIEnumerator(コルーチン)を呼び出すためのアクションです。
Waitや演出、時間制御をC#側で細かく作りたい時に便利で、
FSMから複雑な時間処理を安全に扱えるようになります。
StartCoroutineアクションは「FSM自体をコルーチン化する機能」ではありません。
あくまで外部のMonoBehaviourに書かれたC#コルーチンを呼び出すだけのアクションです。
おわりに
研鑽ばかりしてないで、ゲーム作らなきゃ!


