본문 바로가기

유니티(Unity)

코루틴 확장하기

using System.Collections;
using UnityEngine;

public class CoroutineManager : MonoBehaviour
{
    public static CoroutineManager instance = null;
    public static CoroutineManager Instance
    {
        get
        {
            if (instance == null)
                instance = new GameObject("CoroutineManager").AddComponent<CoroutineManager>();
            return instance;
        }
    }
    //MonoBehaviour가 없는 스크립트의 IEnumerator 실행시키기 위한 메소드
    public void RunCoroutine(IEnumerator method)
    {
        if (method != null)
            StartCoroutine(method);
    }
    //여러 IEnumerator를 순차 시작하는 메소드. 코드를 간결하게 하기 위한 메소드
    public void StartSyncCoroutines(IEnumerator[] methodArr)
    {
        StartCoroutine(OperateSync(methodArr));
    }
    IEnumerator OperateSync(IEnumerator[] methodArr)
    {
        for (int i = 0; i < methodArr.Length; i++)
        {
        	if (methodArr[i] == null) continue;
            yield return StartCoroutine(methodArr[i]);
        }
    }
}

 

활용 예시

using System.Collections;
using UnityEngine;
using Debug = UnityEngine.Debug;
public class TestScripts : MonoBehaviour
{
    CoroutineManager manager;
    void Start()
    {
        manager = CoroutineManager.Instance;

        //모노비헤비어를 상속받지 않는 클래스의 열거자 실행
        TestNoMono test = new TestNoMono();
        manager.RunCoroutine(test.Test());

        //코루틴 동기 실행
        IEnumerator[] enumerators = new IEnumerator[] { Test1(), Test2(), Test3() };
        manager.StartSyncCoroutines(enumerators);
    }
    IEnumerator Test1()
    {
        yield return new WaitForSeconds(1f);
        Debug.Log("Test1");
    }
    IEnumerator Test2()
    {
        yield return new WaitForSeconds(3f);
        Debug.Log("Test2");
    }
    IEnumerator Test3()
    {
        yield return new WaitForSeconds(5f);
        Debug.Log("Test3");
    }
}
public class TestNoMono
{
    public IEnumerator Test() 
    {
        Debug.Log("Test");
        yield return null;
    }
}