はじめに
最近AndroidからUnityエンジニアに転向しました。
UnityではしばしばIEnumeratorを使います。今までは非同期処理の実装に必要なものなんだな〜くらいの認識で使用していたので、そろそろちゃんと理解しようと思います。
IEnumeratorとは
IEnumerator(アイイニューマレーター)とは、C# でリストや配列の要素を 順番に取り出して処理するための仕組みです。プログラムが IEnumerator を使うと、複数の要素を一つずつ繰り返し処理できるようになります。
Unityでは、特に コルーチン を実装する際に IEnumerator が使われ、ゲームの一時停止や待機、繰り返し処理など、非同期的な処理を表現するのに役立ちます。
基本的なイメージ
IEnumerator は、行列の列ごとに処理を進めてくれる「ポインタ」みたいなものです。例えば、リストから値を一つずつ取り出したい場合、IEnumerator が次の要素を順番に指し示し、取り出すことができます。
例
例えば、リスト [1, 2, 3] の要素を一つずつ順番に取り出して処理するとき、IEnumerator を使うと以下のようになります。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Example : MonoBehaviour
{
void Start()
{
// 1から3までの要素を持つリスト
List<int> numbers = new List<int> { 1, 2, 3 };
// numbersリストの要素を一つずつ取り出す
IEnumerator enumerator = numbers.GetEnumerator();
while (enumerator.MoveNext()) // 次の要素がある間繰り返す
{
int number = (int)enumerator.Current; // 現在の要素を取得
Debug.Log(number); // 出力: 1, 2, 3
}
}
}
Unity での使い方(コルーチン)
Unity では、IEnumerator をコルーチンに使うと、一定時間待ったり、毎フレーム少しずつ処理を進めたりすることができます。
コルーチンの例
たとえば、1秒ごとに「Hello」を5回表示する処理をしたいとき
using System.Collections;
using UnityEngine;
public class CoroutineExample : MonoBehaviour
{
void Start()
{
StartCoroutine(PrintHello());
}
IEnumerator PrintHello()
{
for (int i = 0; i < 5; i++)
{
Debug.Log("Hello");
yield return new WaitForSeconds(1); // 1秒待機
}
}
}
このコードでは、以下のことが起こります。
- StartCoroutine(PrintHello()) が呼び出され、コルーチンが開始します。
- yield return new WaitForSeconds(1) によって、毎回「Hello」を表示したあと 1秒間待機します。
- この処理が5回繰り返されます。
まとめ
- IEnumerator は、複数の要素や処理を順番に扱うための仕組み。
- UnityのコルーチンではIEnumeratorが使われ、処理を一時停止して一定時間待ったり、次のフレームまで待機したりすることができます。
- 使い所: リストなどのコレクションの要素を順番に処理する場合や、Unity で非同期処理を行いたい場合(コルーチン)に使います。