본문 바로가기

Unity/코드

코루틴 여러개가 모두 완료될때까지 대기하는 코드

언제 끝날 지 모르는 코루틴 여러개를 동시에 실행하되, 모든 코루틴이 끝날때까지 기다리는 기능이 필요해서 만들어 보았다. 개념으론 Task.WhenAll과 동일한데, Task와 달리 코루틴 여러개를 기다리는 기능은 유니티가 기본으로 제공해주지 않는다.

.

 

WaitForCoroutines

WaitForCoroutines. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

using System.Collections;
using UnityEngine;

public class WaitForCoroutines : CustomYieldInstruction
{
    public override bool keepWaiting => _remainCount > 0;

    private int _remainCount;

    public WaitForCoroutines(MonoBehaviour runner, params IEnumerator[] coroutines)
    {
        IEnumerator WaitingCoroutine(IEnumerator coroutine)
        {
            yield return coroutine;
            _remainCount--;
        }

        _remainCount = coroutines.Length;
        for (var i = 0; i < _remainCount; i++)
        {
            runner.StartCoroutine(WaitingCoroutine(coroutines[i]));
        }
    }
}

 

사용은 간단히 다음과 같은 형식으로 하면 된다.

IEnumerator Test1()
{
    yield return new WaitForSeconds(1);
}

IEnumerator Test2()
{
    yield return new WaitForSeconds(3);
}

IEnumerator Test3()
{
    yield return new WaitForSeconds(5);
}

IEnumerator WaitAll()
{
    yield return new WaitForCoroutines(this, Test1(), Test2(), Test3());
}

'Unity > 코드' 카테고리의 다른 글

C#에서 데이터를 압축하는 코드  (0) 2024.02.29