コルーチン(IEnumerator)を利用して数秒後に処理を行う|Unityゲーム制作

UnityのC#でコルーチンを利用して、「指定した秒数の後に実行」するのを実装してみます。

はじめに

コルーチンとは「処理を中断して、続きから処理を再開」することができる関数です。

コルーチンを使うことで「3秒後に色を変更」、「5秒後に移動」など指定した秒数後に処理を行うことができます。実際の簡単な例を見ながら確認していきます。

公式リファレンスは下記です。

実装開始

まずは下記スクリプトを作成します。Start内でオブジェクトの位置を指定しています。

using UnityEngine;

public class IETest : MonoBehaviour
{
    private void Start()
    {
        transform.position = new Vector2(3.0f, 0f);
    }
}

「2DObject」→「Sprites」→「Square」を追加してスクリプトを追加します。

実行すると、オブジェクトが指定した位置に変更されます。

時間を指定して実行

スクリプトを下記に変更します。

using UnityEngine;

public class IETest : MonoBehaviour
{

    private void Start()
    {
        Invoke("MovePos", 2.0f);
    }

    private void MovePos()
    {
        transform.position = new Vector2(3.0f, 0f);
    }
}

実行すると下記のような感じに2秒後に位置が変更されます。

同じ動きをコルーチンを利用すると下記のようになります。「yield return new WaitForSeconds」で指定した秒数を待ってから次の処理を実行しています。

using UnityEngine;
using System.Collections;

public class IETest : MonoBehaviour
{
    private void Start()
    {
        StartCoroutine(MovePos());
    }

    private IEnumerator MovePos()
    {
        yield return new WaitForSeconds(2.0f);
        transform.position = new Vector2(3.0f, 0f);
    }
}

ポイントとしては「IEnumerator」を戻り値にして、「yield return」が関数内にある事。呼び出すときは「StartCoroutine」という点ですね。

Start内でも実装可能

下記のようにStartでも実装することができます。動きは同じです。

using UnityEngine;
using System.Collections;

public class IETest : MonoBehaviour
{
    private IEnumerator Start()
    {
        yield return new WaitForSeconds(2.0f);
        transform.position = new Vector2(3.0f, 0f);
    }
}

繰り返し実行

下記のようにすると「1秒ごとにランダムな位置に移動」を「10回繰り返して実行」します。

using UnityEngine;
using System.Collections;

public class IETest : MonoBehaviour
{
    private IEnumerator Start()
    {
        for (int i = 0; i < 10; i++)
        {
            transform.position = new Vector2(Random.Range(-5.0f, 5.0f), 0f);
            yield return new WaitForSeconds(1.0f);
        }
    }
}

実行すると下記のような感じですね。

簡単なアニメーションを実行

コルーチンを利用することで簡単なアニメーションを作ることもできます。試しに、以前作成した「もぐら叩きのアニメーション」をコルーチンで実装してみます。

まずは画像を取り込み、下記のように画像をセットします(上記記事参考)。

スクリプトを下記のように作成します。

using UnityEngine;
using System.Collections;

public class IETest : MonoBehaviour
{

    private Vector2 startPosition = new Vector2(0f, -1.5f);
    private Vector2 endPosition = Vector2.zero;

    private float showDuration = 0.5f;
    private float stopduration = 1f;

    private void Start()
    {
        StartCoroutine(Show());
    }

    private IEnumerator Show()
    {
        transform.localPosition = startPosition;

        float elapsedTime = 0f;
        float rate = 0f;

        while (elapsedTime < showDuration)
        {
            rate = elapsedTime / showDuration;
            transform.localPosition = Vector2.Lerp(startPosition, endPosition, rate);
            elapsedTime += Time.deltaTime;
            yield return null;
        }

        transform.localPosition = endPosition;

        yield return new WaitForSeconds(stopduration);

        elapsedTime = 0f;
        while (elapsedTime < showDuration)
        {
            rate = elapsedTime / showDuration;
            transform.localPosition = Vector2.Lerp(endPosition, startPosition, rate);
            elapsedTime += Time.deltaTime;
            yield return null;
        }
        transform.localPosition = startPosition;
    }
}

実行すると下記のような感じに動きます。

簡単なスクリプトの説明

Show関数内の下記部分はモグラが上昇する部分です。showDuration(0.5秒)かけてモグラの位置を少しづつ上に変更しています。「yield return null」で1フレーム処理を中断しています。

        while (elapsedTime < showDuration)
        {
            rate = elapsedTime / showDuration;
            transform.localPosition = Vector2.Lerp(startPosition, endPosition, rate);
            elapsedTime += Time.deltaTime;
            yield return null;
        }
タイトルとURLをコピーしました