Unity コルーチンを変数に格納する





この記事について

C#で関数を変数に格納する場合は、Action型などを使用します。
コルーチン(IEnumerator)の場合はどうすればよいかをまとめました。




解決策

要点

Func<IEnumerator> ie2

といった変数に格納するようにすればOKです。

コード

  • Spaceを押した場合(ie0)は一度のみ実行可
  • A, Bを押した場合(ie1, ie2)は何度でも実行可

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

public class Sample : MonoBehaviour
{
    IEnumerator ie0;
    Func<IEnumerator> ie1;
    Func<IEnumerator> ie2;

    IEnumerator Cor()
    {
        Debug.Log("Start");
        yield return new WaitForSeconds(2.0f);
        Debug.Log("End");
    }

    IEnumerator Cor2()
    {
        Debug.Log("Start2");
        yield return ie2();
        Debug.Log("End2");
    }

    // Start is called before the first frame update
    void Start()
    {
        ie0 = Cor();
        ie1 = Cor;
        ie2 = Cor;
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            StartCoroutine(ie0);
        }
        else if (Input.GetKeyDown(KeyCode.A))
        {
            StartCoroutine(ie1());
        }

        else if (Input.GetKeyDown(KeyCode.B))
        {
            StartCoroutine(Cor2());
        }
    }
}