コルーチン
公式サイト:
目次
概要
参考:
古来より Unity 非同期を実現していたコルーチンとは何者か? – Qiita
使い方
参考:
導入
参考:
Unity のコルーチン機能を使ってみる | MR が楽しい
IEnumerator を使って非同期処理を行う | わたぶろぐ
yield
yield return null
:次のフレームまで処理を中断するyield break
:コルーチンの実行を終了する
参考:
コルーチンで処理を中断/再開/停止させる方法を学ぶ | XR-Hub
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
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;
}
Code language: C# (cs)
参考:
コルーチンで処理を中断/再開/停止させる方法を学ぶ | 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 return
に StartCoroutine
を呼び出して与える。
yield return StartCoroutine("AnotherCoroutine");
Code language: C# (cs)
参考:
コルーチンで処理を中断/再開/停止させる方法を学ぶ | 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
値を返したい
参考:
Unity のコルーチンで値を返す方法/いくつか方法あるぽいけど、その一つを紹介 | ハルシオンシステムの気ままBlog
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;
}
Code language: C# (cs)
参考:
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
破壊されたオブジェクトにアクセスしてしまう
参考:
MissingReferenceException after destroying an object using a coroutine – Stack Overflow
代替/補強
- async / awaint
- UniTask
- UniRx
参考:
Unity 2017 でコルーチンの代わりに async / await を使用する | コガネブログ
2022年現在における UniRx の使いみち – Qiita
Unity のコルーチンを async / await で待機できるように変換してみる – Qiita
仕組み
参考:
Unity のコルーチン/IEnumerator のその先へ | えんじにあ雑記!
リファレンス
UnityEngine.Coroutine | Unity スクリプトリファレンス [公式]
MonoBehaviour.StartCoroutine | Unity スクリプトリファレンス [公式]
IEnumerator インターフェイス | Microsoft Learn [公式]
まとめ/Tips
Unity のコルーチンの使い方をまとめてみた | WonderPlanet Developers’ Blog
コルーチンの使い方と注意点まとめ徹底解説 | 渋谷ほととぎす通信
コルーチンの待ち時間の考え方/フレームで待つか時間で待つか | エクスプラボ
コルーチンの使い方をまとめてみた | 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