コルーチン
メソッドの内容をイテレータにして、順次実行可能にするC#の言語機能
Unityでは独自拡張されて処理の中断とかに使ったりする。
C#自体のコルーチン
system.Collections.Generic.IEnumerator
https://www.fenet.jp/dotnet/column/language/1612/
実行する度に結果が変わるメソッド。みたいな振る舞いをしてる
Unityのコルーチン
https://docs.unity3d.com/ja/2018.4/Manual/Coroutines.html
code:cs
public class Test : MonoBehaviour {
void Start () {
StartCoroutine ("Sample"); // コルーチンを実行
}
private IEnumerator Sample() {
// コルーチンの処理
}
}
UnityにおけるスクリプトのライフサイクルによるとUpdate()の後で呼び出されている模様
コルーチンの中からコルーチンを呼び、親のコルーチンが子のコルーチン完了を待つなら
yield return HogeCoroutine(); で良い
待たないなら普通にStartCoroutine(HogeCoroutine());
https://qiita.com/tmr111116/items/9033ec9b5a565bf2b0b4
コルーチンの中断
yield break;
yield return; は次のフレームまで待機なので注意
できないこと
コルーチンの中身をラムダ式っぽく書く
http://baba-s.hatenablog.com/entry/2014/05/07/165344
コルーチンを後から連結したりする
コルーチンから値を返す
似た機能にasync/awaitがある
Unity上での動作には課題があるので非推奨
より良いやり方としてUniTaskがある
http://neue.cc/2014/12/18_499.html
UniRxのサブモジュール
ーーー
Kotlinにおけるコルーチン
関数定義時に、suspendを添加することで。サスペンド関数を作成できる。
suspend fun fetch() {}
サスペンド関数は、runBlockingやlaunch、asyncなどのコルーチンを開始する関数から実行する事で、非同期処理が可能になる
delay()を初めとした組み込みのサスペンド関数も存在する。この関数を実行すると、処理が停止する
主なサスペンド関数の一覧
delay(timeMillis: Long)
指定したミリ秒数だけコルーチンを一時停止します。スレッドをブロックせず、他のコルーチンの実行を妨げません。
withContext(context: CoroutineContext) { ... }
指定したコンテキスト(例:Dispatchers.IO)でコードブロックを実行します。I/O操作など、特定のスレッドでの実行が必要な場合に使用されます。
suspendCoroutine { continuation -> ... }
非コルーチンのコールバックベースのAPIを、サスペンド関数として扱うために使用されます。コルーチンの中断と再開を手動で制御できます。
suspendCancellableCoroutine { continuation -> ... }
suspendCoroutine のキャンセル対応版です。コルーチンのキャンセルを適切に処理する必要がある場合に使用されます。
Job.join()
特定のジョブ(コルーチン)の完了を待機します。
Deferred.await()
非同期に計算された結果を待機し、取得します。