コルーチン

公式サイト:

コルーチン | Unity マニュアル [公式]

概要

参考:

古来より Unity 非同期を実現していたコルーチンとは何者か? – Qiita

使い方

参考:

Unity におけるコルーチンの性質まとめ – Qiita

非同期処理を理解する コルーチン編 – Qiita

コルーチンの使い方 | TECH PROjin

Unity におけるコルーチンの使い方 | creive

導入

参考:

Unity のコルーチン機能を使ってみる | MR が楽しい

yield

  • yield return null次のフレームまで処理を中断する
  • yield breakコルーチンの実行を終了する

参考:

コルーチンで処理を中断/再開/停止させる方法を学ぶ | XR-Hub

コルーチンの中断処理 | まみももめも

コルーチンの中断/終了の仕方いろいろ – Qiita

Unity のコルーチン待機での yield retun 0 と yield retun null の違い | netsis

yield return 0 を使用すると 20B の GC Alloc が発生する | コガネブログ

How do I return a value from a coroutine? – Unity Answers

IEnumerator’s yield return null – Stack Overflow

What is the difference between “yield return 0” and “yield return null” in Coroutine? – Stack Overflow

WaitForSeconds

コルーチン内で処理を5秒間中断する。

yield return new WaitForSeconds(5.0f);
Code language: C# (cs)

new により 20 バイトのメモリ割り当てが発生するので、高頻度で使用する場合は、ループ外でキャッシュしておいて再利用する方が良い。

var wait = new WaitForSeconds(0.01f);
while (true) {
    yield return wait;
}

参考:

コルーチンで処理を中断/再開/停止させる方法を学ぶ | XR-Hub

クリックしてから1秒間だけ true にする | フタバゼミ

Unity の GC Allocate と WaitForSeconds – Qiita

WaitForSeconds はキャッシュして使おう | 渋谷ほととぎす通信

UnityEngine.WaitForSeconds | Unity スクリプトリファレンス [公式]

I want to understand the syntax of coroutines – Stack Overflow

WaitForEndOfFrame

次のフレームをレンダリングした後に処理を再開する。

参考:

yield return null と WaitForEndOfFrame の違い | ロバメモ

WaitForEndOfFrame でフレームを送ると Input が拾えない – Qiita

コルーチン内から他のコルーチンを呼び出す

yield returnStartCoroutine の呼び出して与える。

yield return StartCoroutine("AnotherCoroutine");

参考:

コルーチンで処理を中断/再開/停止させる方法を学ぶ | XR-Hub

キー入力を待つ

参考:

コルーチン内で入力待ちする | トーフメモ

How to make unity wait until i press i key – Stack Overflow

キーを押している間のみ処理を実行する

参考:

Start a Coroutine on Key Press (and keep it running) – Unity Answers

Update からコルーチンを開始する

処理が実行中の場合にコルーチンが二重に生成されないようにガードを追加する。

private bool isRunning = false;

IEnumerator DoSomething()
{
    if (isRunning)
        yield break;
    isRunning = true;

    while (/* condition */)
    {
        // Do something
        yield return null;
    }

    // End of running
    isRunning = false;
}

参考:

Update() 内で StartCoroutine() を使うときの注意 – Qiita

エディタ拡張で使う

参考:

エディタ拡張で Unity を再生していない時でもコルーチンを使い非同期処理が行える EditorCoroutineUtility | kan のメモ帳

StartCoroutine

参考:

MonoBehaviour.StartCoroutine | Unity Scripting API [Official]

StopCoroutine / StopAllCoroutines

参考:

コルーチンをコルーチン内/外から停止させる方法 | はなちるのマイノート

MonoBehaviour.StopCoroutine | Unity Scripting API [Official]

MonoBehaviour.StopAllCoroutines | Unity Scripting API [Official]

WaitUntil

条件が満たされるまで処理を中断する。条件が満たされていた場合、次のフレームで続きの処理を実行する。

参考:

UnityEngine.WaitUntil | Unity スクリプトリファレンス [公式]

WaitWhile

条件が満たされている間、処理を中断し続ける。最初から条件が満たされていなかった場合はそのフレーム内で続きの処理を実行する。

参考:

UnityEngine.WaitWhile | Unity スクリプトリファレンス [公式]

ユーザーの入力を待つ (WaitForAction)

参考:

Making a coroutine wait for input from UI button – Unity Forum

コールバックを呼び出す

参考:

getting return value of a Coroutine in unity – Stack Overflow

処理が実行されない

参考:

yield return new WaitForSeconds doesn’t work – Stack Overflow

代替/補強

  • async / awaint
  • UniTask
  • UniRx
こちらのページを参照

参考:

Unity 2017 でコルーチンの代わりに async / await を使用する | コガネブログ

2022年現在における UniRx の使いみち – Qiita

UniTask 機能紹介 – Qiita

Unity のコルーチンを async / await で待機できるように変換してみる – Qiita

仕組み

参考:

Unity のコルーチン/IEnumerator のその先へ | えんじにあ雑記!

まとめ/Tips

参考:

Unity のコルーチンでできる事のメモ | テラシュールブログ

Unity のコルーチンの使い方をまとめてみた | WonderPlanet Developers’ Blog

コルーチンの使い方と注意点まとめ徹底解説 | 渋谷ほととぎす通信

コルーチンの待ち時間の考え方/フレームで待つか時間で待つか | エクスプラボ

Coroutine Chain

入手:

Coroutine Chain | Unity Asset Store [Official]

リポジトリ:

geniikw/CoroutineChain – GitHub

参考:

Coroutine Chain – コルーチンを連結できる | コガネブログ

Coroutine Sequence

コード:

Coroutine Sequence – コルーチンを組み合わせて実行する – Qiita

Event Aggregator Message System

入手:

Event Aggregator Message System | Unity Asset Store [Official]

Event Aggregator (Sov3rain)

リポジトリ:

Sov3rain/Unity-Event-Aggregator: Simple .net EventAggregator for Unity engine – GitHub

Prism

ドキュメント:

Event Aggregator | Prism [Official]

参考:

Event Aggregator Hierarchy – Stack Overflow

Async Await Util

入手:

Async Await Support | Unity Asset Store [Official]

リポジトリ:

svermeulen/Unity3dAsyncAwaitUtil: A Bunch of Code to Make Using Async-Await Easier – GitHub

参考:

How to Use Async-Await Instead of Coroutines in Unity 2017 | Steve Vermeulen

記事をシェアする:
タグ:

コメントを残す

メールアドレスが公開されることはありません。

Protected by reCAPTCHA