【Unity】コルーチン入門

コルーチンとは? Unityでゲームを作っていると、「3秒待ってから次の処理を実行したい」「フェードアウトを少しずつ進めたい」といった、時間に関わる処理を書きたくなる場面が出てきます。 こうした処理をUpdateだけで書こうとすると、経過時間を測るための変数を用意し、毎フレーム加算して、しきい値を超えたかどうかを判定して……と、コードがあっという間に膨らんでいきます。 using UnityEngine; public class WaitWithUpdate : MonoBehaviour { private float _elapsedTime; private bool _isWaiting = true; private void Update() { if (_isWaiting) { // 経過時間を加算する _elapsedTime += Time.deltaTime; // 3秒経過したかチェックする if (_elapsedTime >= 3f) { Debug.Log("3秒経過しました"); _isWaiting = false; } } } } たった「3秒待ちたい」だけなのに、状態を管理するフラグや経過時間の変数が必要になってしまいます。 こんなときに便利なのがコルーチン(Coroutine)です。 コルーチンを使うと、処理の途中で一時停止して、後で再開するような書き方ができます。 Updateに状態管理を持ち込まずに、自然な流れで「待つ」処理を書けるのが利点です。 Unity Docs Write and run coroutines • Split tasks across frames with coroutines • 6000.0 • Unity Editor Write and run coroutine methods to do work that takes effect over several frames, such as a gradual fade-out effect. docs.unity3d.com 先ほどの3秒待つ処理を、コルーチンで書き直してみると以下のようになります。 using System.Collections; using UnityEngine; public class WaitWithCoroutine : MonoBehaviour { private void Start() { // コルーチンを開始する StartCoroutine(WaitAndLog()); } private IEnumerator WaitAndLog() { // 3秒待つ yield return new WaitForSeconds(3f); Debug.Log("3秒経過しました"); } } フラグも経過時間の変数もなくなり、コードを上から下へ追うだけで処理の流れが読み取れます。
  • Unity
  • C#
  • 非同期処理