コンテンツにスキップ

コルーチン

Unityライクなコルーチン機能を利用できます。コルーチンとは、複数フレームにまたがる非同期処理を簡潔に記述するための仕組みです。

基本の使い方

まず、プラグインとして CoroutineManager をアプリケーションに登録します。

// プラグイン登録例(Program.cs)
var app = PrometeApp.Create()
.Use<CoroutineManager>()
.BuildWithOpenGLDesktop();
return app.Run<MainScene>();

CoroutineManager を受け取り、Startメソッドに IEnumerator を渡します。この IEnumerator を返すメソッド内の yield return にイールド命令(後述)を渡すことで、一定時間や条件で処理を遅延させることができます。

// シーンでの利用例
public class MainScene(CoroutineManager coroutines, ConsoleLayer console) : Scene
{
public override void OnStart()
{
coroutines.Start(MyCoroutine());
console.Print("コルーチンを開始しました");
}
private IEnumerator MyCoroutine()
{
// 1秒待つ
yield return new WaitForSeconds(1.0f);
Console.WriteLine("1秒経過");
}
}

主なAPI

  • coroutines.Start(IEnumerator)
    コルーチンを開始
  • coroutines.Stop(Coroutine)
    コルーチンを停止
  • coroutines.Clear()
    全コルーチン停止

コルーチンの終了条件

コルーチンは、以下の条件で終了・中断されます。

  • 処理が終了したとき
  • Stopメソッドが呼ばれたとき
  • ハンドルされていない例外が発生したとき
    • 例外が発生すると即座に中断され、Errorコールバックが呼び出されます
    • Errorコールバックが登録されていない場合、アプリケーションはクラッシュします
  • yield break が実行されたとき
  • シーンが切り替わったとき
    • ただし、Coroutine.KeepAlive() メソッドを呼び出すことで、シーンが切り替わっても中断されなくなります

イールド命令

コルーチンの中では、 yield return で以下のようなオブジェクト(イールド命令)を返すことで、処理を遅延できます。

  • WaitForSeconds(float seconds)
    指定した秒数だけ待機します
  • WaitUntil(Func<bool> condition)
    条件がtrueになるまで待機します
  • WaitWhile(Func<bool> condition)
    条件がtrueの間だけ待機します
  • WaitForTask(Task task)
    指定したTask/ValueTaskが完了するまで待機します
  • WaitUntilNextFrame()
    次のフレームまで待機します(yield return null でも同等)

コールバックの登録(Then, Error)

コルーチンが正常に完了したときや、例外で中断したときに呼び出されるコールバックを登録できます。

coroutines
.Start(MyCoroutine())
.Then(() => Console.WriteLine("完了!"))
.Error(ex => Console.WriteLine($"例外発生: {ex.Message}"));
  • Then(Action)
    コルーチンが正常終了したときに実行されます
  • Error(Action<Exception>)
    コルーチン内で例外が発生したときに実行されます