コルーチン
公式サイト:
概要
参考:
古来より非同期を実現していたコルーチンとは何者か? – Qiita
使い方
参考:
Coroutines – How and When to Use Them | Game Dev Beginner
Using Coroutines | LogRocket Blog
導入
参考:
IEnumerator を使って非同期処理を行う | わたぶろぐ
基本
メソッドをコルーチンとして定義するには、IEnumerator
型を返させる。
IEnumerator DoSomething()
{
yield return null;
// Do something here
}
Code language: C# (cs)
注意事項
- コルーチン内に
yield
を必ず一つ以上含める必要がある。
参考:
コルーチンの使い方と注意点まとめ徹底解説 | 渋谷ほととぎす通信
yield
yield return null
: 次のフレームまで処理を中断するyield break
: コルーチンの実行を終了する
参考:
コルーチンで処理を中断/再開/停止させる方法を学ぶ | XR-Hub
コルーチン待機での 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
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 return
に StartCoroutine
を呼び出して与える。
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
コルーチンを 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