기록하며 노세

코루틴 (Coroutine)

늙어서노세 2024. 2. 14. 15:09

 코루틴은 특정 지연상황을 만들 때 사용한다. 메소드 형식으로 return형은 IEnumerator라는 특수한 형식으로, 지연 문법은 yield return 키워드로 지연 객체를 생성하여 구현한다. 아래는 코루틴에 대한 내용이다.

 

 위의 설명만 보아서는 이해가 되질 않을 것 같으니 아래에 문법 예시를 첨부하겠다.

 위와 같이 구현하면 WaitForSecond(지연시간); 객체를 yield return으로 생성하여 원하는 시간만큼 지연한 뒤, 지연 뒤에 실행될 코드를 수행한다. 아래 반복문은 위의 정의를 응용한 것이니 이해하기 쉬울 것이다.

 

 코루틴의 정의를 이용하여, 몇 가지 코루틴 메소드를 아래와 같이 작성해 보았다.

using System.Collections;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using UnityEngine;

public class CoroutineComponent : MonoBehaviour
{
    private Coroutine coroutine5 = null;
    void Start()
    {

        //// 코루틴 메소드 실행
        //StartCoroutine("CoroutineType1", 3f);

        //StartCoroutine(CoroutineType2(2f, 4f, 1.5f));

        // 10초 카운트 타이머 실행
        //StartCoroutine(CoroutineType3(10));

        //StartCoroutine(CoroutineType4());

        //StartCoroutine("CoroutineType5"); // 이름으로 코루틴 생성

        //coroutine5 = StartCoroutine(CoroutineType5()); // 실행으로 코루틴 생성 (참조값 저장)
    }

    private void Update()
    {
        Debug.Log("Update 이벤트 메소드 실행");
        // Update 쪽에서는 Coroutine 사용금지

        if (Input.GetKeyDown(KeyCode.Escape))
        {
            Debug.Log("코루틴 종료");
            //StopCoroutine("CoroutineType5"); // 이름으로 생성된 코루틴 타입5 종료

            if (coroutine5 != null)
            {
                StopCoroutine(coroutine5);
                coroutine5 = null;
            }
        }
    }

    // 실행 시 한 번의 시간 지연을 수행하는 코루틴
    IEnumerator CoroutineType1(float time)
    {
        Debug.Log("코루틴 시작");

        // 4초간 지연
        yield return new WaitForSeconds(time);

        Debug.Log("코루틴 종료");
    }

    // 실행 시 여러 번의 지연을 수행하는 코루틴
    IEnumerator CoroutineType2(float time1, float time2, float time3)
    {
        Debug.Log("코루틴 시작");

        Debug.Log("첫번째 시간 지연 시작 : " + time1);
        yield return new WaitForSeconds(time1);
        Debug.Log("첫번째 시간 지연 종료");

        Debug.Log("두번째 시간 지연 시작 : " + time2);
        yield return new WaitForSeconds(time2);
        Debug.Log("두번째 시간 지연 종료");

        Debug.Log("세번째 시간 지연 시작 : " + time3);
        yield return new WaitForSeconds(time3);
        Debug.Log("세번째 시간 지연 종료");

        Debug.Log("코루틴 종료");
    }

    // 카운트 타이머 코루틴
    IEnumerator CoroutineType3(int startTime)
    {
        while(startTime >= 0)
        {
            yield return new WaitForSeconds(1f);
            Debug.Log("카운트 타이머 : " + startTime--);
        }
    }

    // Update 지연 코루틴
    IEnumerator CoroutineType4()
    {
        while(true)
        {
            if(Input.GetKeyDown(KeyCode.Escape))
            {
                Debug.Log("Update 지연 코루틴 종료");
                yield break; // 코루틴 종료
                // break와 차이점을 알아야 함
            }

            yield return null;
            Debug.Log("Update 주기 코루틴 실행");
        }
        Debug.Log("코루틴 자연 종료"); // break로 종료할 때 실행됨
    }

    // 코루틴 1초 타이머(무한)
    IEnumerator CoroutineType5()
    {
        int time = 0;
        while(true)
        {
            yield return new WaitForSeconds(1f);
            time++;
            Debug.Log("무한 시간 타이머 : " + time);
        }
    }
}

 Start() 메소드를 보면,

 

Type1은 이름과 매개변수를 넘겨주어 실행

Type2는 메소드를 호출하여 매개변수를 넘겨주어 실행

Type3은 매개변수 포함 메소드 호출

Type4는 메소드 호출로 실행

Type5는 이름으로 호출하거나 코루틴 객체를 생성하여 실행한 모습이다.

 

 또한, 각 코루틴 메소드마다 다른 yield return 방식을 사용하고 있는데,

 

Type1은 yield return new WaitForSeconds(); 를 사용하여 일정 시간 지연

Type2는 yield return new WaitForSeconds(); 를 여러 번 사용하여 일정 시간 지연을 여러 번 실행

Type3는 카운터 타이머를 구현하여, 매개변수로 받은 startTime이 10부터 1씩 줄어드는 동안 startTime을 출력

Type4는 Escape키, 즉 Esc 키를 KeyDown하였다면 yield break하여 코루틴 종료, 아니면 yield return null; 을 실행하여 Update 이벤트 메소드 주기와 동일하게 지연되는 Update 주기 코루틴을 실행

Type5는 yield return new WaitForSeconds(); 를 사용하여 무한 시간 타이머를 실행하고, Update() 이벤트 메소드에서 Esc 키를 KeyDown하면 코루틴을 종료하는 코드를 구현한 모습을 볼 수 있다.

 

 오늘 강의에서는 새로운 사이트를 알게 되었는데, kenney라는 사이트(https://www.kenney.nl/)에 대해 알게 되었다. 애니메이션이 포함되어 있진 않지만, 2D와 3D Assets를 포함한 리소스들을 무료로 다운받을 수 있고, 재배포까지 가능한 사이트로, 도네이션을 한다면 원본 파일을 받을 수 있다고 한다. 퀄리티가 매우 좋은 편은 아니기 때문에 개인 포트폴리오용 보다는 즐기기용으로, 개인 게임 개발을 하거나 일정 Asset을 원한다면 편하게 사이트에 방문하여 검색해보도록 하자.

 

 kenney 사이트 포함 새로운 프로젝트에 관한 이야기는 다음 글에서 진행하겠다.