本ページにはプロモーションが含まれます
PlaymakerUnity

【Unity】PlaymakerでStartCoroutineを使う

この記事は約4分で読めます。

はじめに

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#コルーチンを呼び出すだけのアクションです。

おわりに

研鑽ばかりしてないで、ゲーム作らなきゃ!