StartCoroutine(string methodname) の引数はメソッド名の文字列である。
StartCoroutineにラムダ式を直接渡すことは出来ない。以下のように記述してもエラーになる。
StartCoroutine(DelayMethod(() =>
{
doSomething();
}));
そこで、
IEnumeratorを返すメソッドを用意してから非同期処理するコードをラムダ式で渡すことになる。
private IEnumerator DelayMethod(Action action)
{
yield return new WaitForSeconds(5.0f);
action();
}
非同期処理のタスク管理も自前で書くことになり面倒。
Unityに依存しないC#の非同期処理async/awaitとTaskで書いてみる。
非同期タスクの逐次処理の例。他にも全タスクの完了待ちなどの便利なメソッドが用意されている。
タスクのキャンセル処理の例。
タスク管理用トークンを通してタスクを管理できる。
ここでは処理中のタスクをキャンセルするコードを示した。Done3aは表示されない。
タスクの完了、失敗、キャンセルにたいする例外処理やタスクの制御を行うには async/await と Task を用いると良さそう。