コルーチンの使い方

コルーチンは、並行処理をしたいときによく使われます
次のいくつかのサンプルから動作を確認しましょう

1秒おきに処理をしたい場合

Update()メソッドを使う方法

前フレームとの時間差(Time.deltaTime)を足していき、合計が1になった時(つまり1秒経過した時)に必要な処理を実行します

using UnityEngine;

public class TimeDeltatimeSample : MonoBehaviour
{
    float sum;
    float span = 1;

    void Update()
    {
        sum += Time.deltaTime;

        if (sum > span)
        {
            sam = 0;
            Debug.Log("Loop");
        }
    }
}

InvokeRepeating()メソッドを使う方法

指定したメソッドを条件に応じて繰り返します
Update()メソッドは使わない方法になります

using System.Collections;
using UnityEngine;

public class CoroutineSample : MonoBehaviour
{
    void Start()
    {
        // 引数1:繰り返すメソッド(string型) 引数2:繰り返し開始までの時間 引数3:繰り返し間隔
        InvokeRepeating(nameof(Loop2), 0, 1);
    }

    void Loop2()
    {
        Debug.Log("Loop2");
    }
}

StartCoroutine()メソッドを使う方法

繰り返す条件は、メソッド側で設定します
これも同様にUpdate()メソッドは使いません

using System.Collections;
using UnityEngine;

public class CoroutineSample : MonoBehaviour
{
    void Start()
    {
        StartCoroutine(Loop1());
    }

    private IEnumerator Loop1()
    {
        while (true)
        {
            Debug.Log("Loop");
            // ここで制御を他のスクリプトに戻します。次の条件が満たされると、その続きから実行されます
            yield return new WaitForSeconds(1.0f);
        }
    }
}

別のスクリプトからコルーチンを止める方法

同じゲームオブジェクトに2つのスクリプトをコンポーネントとしてアタッチしているケースになります

コルーチンを止める処理を記述したスクリプト

using UnityEngine;

public class StopCoruotine : MonoBehaviour
{
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            GetComponent<CoroutineSample>().Stop();
        }
    }
}

コルーチンを実行するスクリプト

using System.Collections;
using UnityEngine;

public class CoroutineSample : MonoBehaviour
{
    public Coroutine coroutine;

    void Start()
    {
        coroutine = StartCoroutine(Loop1());
    }

    IEnumerator Loop1()
    {
        while (true)
        {
            Debug.Log("Loop");
            yield return new WaitForSeconds(1.0f);
        }
    }

    public void Stop()
    {
        StopCoroutine(coroutine);
    }
}

Unity

Posted by hidepon