Edited at

Unityのコルーチンを分かりやすく説明してみる。

More than 1 year has passed since last update.

Unity初心者です。Unityのチュートリアルを触りましたが、コルーチンという概念がいまいち理解できなかった、yield returnなんやねんとなりましたので、自分用にまとめました。


対象読者

・Unityを始めたばかりの超初心者


コルーチンとは

Unityの公式リファレンスに以下記載があります。


コルーチンとは実行を停止して Unity へ制御を戻し、ただし続行するときは停止したところから次のフレームで実行を継続することができる関数です。


なんとなく分かりますが、そんなことできるのって感じました。停止したところから実行を継続する?関数なんやろ!returnしたら処理終了やん!


コルーチンの宣言

イメージ湧かないので、実際にコルーチンのコードを見てみようと思います。

以下、シューティングゲームチュートリアルで使用したコルーチンのスニペットです。


Shot.cs


using System.Collections;
using UnityEngine;

public class Shot : MonoBehaviour {

Spaceship spaceship;

IEnumerator Start()
{
spaceship = GetComponent<Spaceship> ();

while (true) {

spaceship.Shot (transform);

yield return new WaitForSeconds (0.05f);
}
}
}


戻り値の型IEnumeratoryield returnステートメントが見つかります。

上記の2つの要素を用いることでUnityのコルーチンを宣言したことになります。


IEnumeratorとは

IEnumaratorは、System.Collectionsに含まれるインターフェースです。

以下、MSDNの概要。


非ジェネリック コレクションに対する単純な反復処理をサポートします。


foreach等の反復処理に必要な機能を提供するインターフェースという事になると思います。


yield returnとは

yield returnは、JavaとPHPしか触ってないと馴染みがないと思います。

MSDNには、下記記載がありました。


ステートメントで yield キーワードを使用した場合、メソッド、演算子、または get アクセサーが反復子であることを示します。


なるほど、わからん。反復子ってなんだ。というわけで、こちらも調べてみると


イテレータ(英語: iterator)とは、プログラミング言語において配列やそれに類似する集合的データ構造(コレクションあるいはコンテナ)の各要素に対する繰り返し処理の抽象化である。 実際のプログラミング言語では、オブジェクトまたは文法などとして現れる。 JISでは反復子(はんぷくし)と翻訳されている。


イテレーターのことでした。ならイテレーターと呼べばええやん。反復可能なオブジェクトを指すわけです。正確にはオブジェクト以外も指すのでしょうがそこは気にしない方向でいきましょう。もう少し調べてみると下記記載を見つけました。


iterator メソッドまたは get アクセサーは、コレクションに対するカスタム イテレーションを実行します。 反復子メソッドは、yield return ステートメントを使用して、各要素を 1 回に 1 つ返します。 yield return ステートメントに達すると、コードの現在の場所が記憶されます。 次回、iterator 関数が呼び出されると、この位置から実行が再開されます。(出典:MSDN)


知りたいこと全部書かれてました(汗)

フレーム毎に、yield returnステートメントの位置で処理を停止し、再度呼び出した場合は、そこから処理を続行できるのがUnityのコルーチンなわけですね。