はじめに
コルーチンとは?
コルーチンとは途中で一時停止し、後で再開することができる機能を持った関数です。待ち時間や複雑な非同期操作を管理するのに役立ちます。例えば、待ち時間のあるアニメーション演出や、一定時間後に実行される処理を実装する際に非常に便利です。
コルーチンの使いどころ
コルーチンの主な使いどころの一例を紹介します。
- ゲーム開始前のカウントダウン演出: ゲームスタート前にカウントダウンを表示したい場合、秒ごとに数字を表示する処理を実行する必要があります。
- プレイヤーの行動後、一定時間経過後の処理: アイテムを取得した後に一時的な無敵状態だったり、足が速くなったりする効果を実装する場合などです。
- インタラクティブなアクションの組み込み: プレイヤーがドアを選択すると、ドアが数秒後に開くような処理や、アクションゲームで敵に攻撃したら一時的に止まるヒットストップ処理などがあります。
いろんなところで使えるんだね!
次の章から、実際の使い方を解説していきます!
コルーチンの基本的な使い方
コルーチンの宣言
コルーチンはIEnumerator
型を返す関数として宣言されます。関数名の前にIEnumeratorをつけるだけでOKです。
using UnityEngine;
using System.Collections;
public class CoroutineExample : MonoBehaviour
{
IEnumerator MyCoroutine()
{
// コルーチンの処理内容をここに書く
}
}
実行開始するには
コルーチンを開始するには、StartCoroutine
メソッドを使用します。
StartCoroutine(MyCoroutine());
一定時間待つ処理
WaitForSeconds
は、コルーチン内で一定時間待つための特別な関数です。これを使用すると、指定した秒数だけ処理を一時停止できます。以下はWaitForSeconds
の使用例です。
IEnumerator MyCoroutine()
{
Debug.Log("スタート");
yield return new WaitForSeconds(2.0f); // 2秒待つ
Debug.Log("2秒待ちました");
}
ちなみに、1フレームだけ待ちたい場合は、以下のコードを使いましょう。
yield return null; // 1フレーム待つ
他のコルーチンが終了するのを待つこともできます。
yield return StartCoroutine(MyCoroutine());
これらの待機処理はコルーチンの中に何個も入れることができるよ!
停止するには
コルーチンの処理を途中で停止させるには、StopCoroutineを使います。
StartCoroutine(MyCoroutine());
または、コルーチン内にyield breakを書くことで止めることもできます。
yield break; // 停止
実際の使用例
ゲーム開始前のカウントダウン演出
ゲームの面白さを引き立たせるために、ゲーム開始前にカウントダウン演出を行うことがあります。この演出を実現するために、コルーチンを使用して以下のようなカウントダウン処理を行うことができます。
using UnityEngine;
using System.Collections;
public class CountdownExample : MonoBehaviour
{
public int countdownDuration = 3;
IEnumerator StartCountdown()
{
for (int i = countdownDuration; i > 0; i--)
{
Debug.Log("カウントダウン: " + i);
yield return new WaitForSeconds(1.0f);
}
Debug.Log("スタート!");
}
void Start()
{
StartCoroutine(StartCountdown());
}
}
他にも、アイテムを使ったら一定時間無敵になったり、スピードが速くなったりするような処理にも使えます。
アクションゲームで、攻撃した時に一時的に時間が止まる処理(ヒットストップ)にも活用できます。
コルーチンの応用的な使い方
コルーチンの一時停止と再開
コルーチン内で一時停止し、後で再開することで、処理を制御できます。以下の例では、コルーチン内でプレイヤーの入力待ちを行い、入力があった時に処理を再開します。
using UnityEngine;
using System.Collections;
public class PauseResumeCoroutineExample : MonoBehaviour
{
IEnumerator WaitForPlayerInput()
{
Debug.Log("スペースキー入力待ち");
while (!Input.GetKeyDown(KeyCode.Space))
{
yield return null;
}
Debug.Log("スペースキーが入力されたので再開");
}
void Start()
{
StartCoroutine(WaitForPlayerInput());
}
}
複数のコルーチンの実行と管理
複数のコルーチンを実行し、それらの進行状況を適切に管理することができます。以下の例では、複数のコルーチンを順番に実行し、全てが完了するのを待ってから次の処理を行います。
using UnityEngine;
using System.Collections;
public class MultipleCoroutinesExample : MonoBehaviour
{
IEnumerator Coroutine1()
{
Debug.Log("Coroutine 1 スタート");
yield return new WaitForSeconds(2.0f);
Debug.Log("Coroutine 1 終わり");
}
IEnumerator Coroutine2()
{
Debug.Log("Coroutine 2 スタート");
yield return new WaitForSeconds(3.0f);
Debug.Log("Coroutine 2 終わり");
}
void Start()
{
StartCoroutine(WaitForBothCoroutines());
}
IEnumerator WaitForBothCoroutines()
{
yield return StartCoroutine(Coroutine1());
yield return StartCoroutine(Coroutine2());
Debug.Log("両方のコルーチンが終わりました");
}
}
おわりに
コルーチンの使い方について紹介しました!
コルーチンのポイント
- IEnumeratorで宣言する
StartCoroutine
で実行WaitForSeconds
などで一定時間待つ処理を入れる
多くの場面で使えますので、ぜひ活用してみましょう!