コルーチン

公式サイト:

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

概要

参考:

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

使い方

参考:

コルーチンの性質まとめ – Qiita

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

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

コルーチンの使い方 | creive

コルーチン | yttm-work

Coroutines – How and When to Use Them | Game Dev Beginner

Using Coroutines | LogRocket Blog

導入

参考:

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

IEnumerator を使って非同期処理を行う | わたぶろぐ

基本

メソッドをコルーチンとして定義するには、IEnumerator 型を返させる。

IEnumerator DoSomething()
{
    yield return null;
    // Do something here
}Code language: C# (cs)
注意事項
  • コルーチン内に yield を必ず一つ以上含める必要がある。

参考:

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

yield

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

参考:

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

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

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

コルーチン待機での 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;
    // Do something here 
}Code language: C# (cs)

参考:

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

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

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");Code language: C# (cs)

参考:

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

キー入力を待つ

参考:

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

How to make Unity wait until I press a key – Stack Overflow

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

参考:

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

値を返したい

参考:

コルーチンで値を返す方法/いくつか方法あるぽいけど、その一つを紹介 | ハルシオンシステムの気ままBlog

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

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

private bool isRunning = false;

IEnumerator DoSomething()
{
    if (isRunning)
    {
        yield break;
    }

    // Start running
    isRunning = true;

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

    // End of run
    isRunning = false;
}Code language: C# (cs)

参考:

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

エディタ拡張で使う

ドキュメント:

Class EditorCoroutineUtility | Editor Coroutines 1.0 Manual [Official]

参考:

Editor Coroutine Utility を使い、何か重要なバッチを走らせている風なダイアログを作る – Qiita

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

Editor Coroutines – 使い方まとめ/Editor でコルーチンが使える | LIGHT11

Edit モード中にコルーチンを実行する方法 | 渋谷ほととぎす通信

StartCoroutine

コルーチンメソッドを呼び出して、返り値を StartCoroutine の引数に与える。

StartCoroutine(DoSomething());Code language: C# (cs)

文字列でコルーチン名を与える。(※旧式の記述)

StartCoroutine("DoSomething");Code language: C# (cs)

nameof 式でコルーチン名を取得して与える。

StartCoroutine(nameof(DoSomething));Code language: C# (cs)

ドキュメント:

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

参考:

修正漏れを防止する nameof について | NO システム, NO ライフ

StartCoroutine などで、引数に渡すメソッド名をうっかり変えそびれるのを防ぐ方法 – Qiita

StartCoroutine は文字列指定しない | 渋谷ほととぎす通信

How do you name your coroutines? – Unity Forum

StartCoroutine with string method name from another script? – Unity Answers

StartCoroutine – Stack Overflow

StopCoroutine / StopAllCoroutines

ドキュメント:

MonoBehaviour.StopCoroutine | Unity Scripting API [Official]

MonoBehaviour.StopAllCoroutines | Unity Scripting API [Official]

参考:

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

StopCoroutine するときは null チェックしよう | 渋谷ほととぎす通信

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

破壊されたオブジェクトにアクセスしてしまう

参考:

MissingReferenceException after destroying an object using a coroutine – Stack Overflow

代替/補強

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

参考:

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

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

UniTask 機能紹介 – Qiita

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

仕組み

参考:

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

リファレンス

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

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

IEnumerator インターフェイス | Microsoft Learn [公式]

まとめ/Tips

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

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

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

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

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

チュートリアル

How & When to Use Coroutines (Game Dev Beginner)

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