Unity

[Unity] 코루틴이란?

Honey Badger 2023. 5. 13. 20:20

코루틴이란 시간의 경과에 따라 일련의 절차적 단계를 수행시키는 로직을 구현하는 데 사용되는 객체이다. 사실 Update함수에서도 가능한 내용들이지만 초당 호출이나, 매 프레임마다 굳이 호출이 필요하지 않은 부분을 매 프레임마다 호출하는 것은 바람직한 로직이 아니다. 

 

 

코루틴의 역할

코루틴은 함수를 호출한다. 함수는 한 프레임에 호출되어 완료된다. 이때 함수는 IEnumerator 형을 반환 값으로 가지는 함수를 사용하고, IEnumerator에서 사용하는 다양한 yield return 구문을 사용해 흐름을 제어한다. 

 

 

yield return

yield return 구문에는 아래와 같이 yieldInstruction 클래스를 사용한다.

 

  • yield return null : 다음 프레임에 실행을 재개한다.
  • yield return new WaitForSeconds : 지정된 시간 후에 재개한다.
  • yield return new WaitForSecondsRealtime :  Time.timescale 값에 영향을 받지 않고 지정된 시간 후에 재개한다. 
  • yield return new WaitForFixedUpdate : 모든 스크립트에서 모든 FixedUpdate가 호출된 후에 재개한다.
  • yield return new WaitForEndOfFrame : 모든 카메라와 GUI가 렌더링을 완료하고, 스크린에 프레임을 표시하기 전에 호출된다. 
  • yield return StartCoroutine() : 코루틴을 연결하고 코루틴이 완료된 후에 재개한다.

 

 

사용법 

   Coroutine은 string, IEnumerator, Coroutine 이렇게 3가지 전달 인자를 사용한다.  이 세가지 전달 인자는 혼합하여 사용하지 말라고 유니티에서 경고하고 있다. 

 

StartCoroutine()

string MethodName을 사용하는 경우, 두 번째 매개변수로, 전달 인자를 사용한다. 

  • Coroutine StartCoroutine(string MethodName, object = null)
  • Coroutine StartCoroutine(IEnumerator routine)
  • Coroutine StartCoroutine(Coroutine routine)

 

StopCoroutine()

  • StopCoroutine(string MethodName)
  • StopCoroutine(IEnumerator routine)
  • StopCoroutine(Coroutine routine)

 

 

예제

 

using System.Collections;
using UnityEngine;

public class CoroutineExample : MonoBehaviour
{
    private IEnumerator Start()
    {
        yield return StartCoroutine(PrintMessages());
        Debug.Log("Coroutine finished.");
    }

    private IEnumerator PrintMessages()
    {
        for (int i = 0; i < 5; i++)
        {
            Debug.Log("Coroutine message " + i);
            yield return new WaitForSeconds(1f); // 1초마다 대기
        }
    }
}

 

 

 

 

코루틴의 단점

  1. 중첩 코루틴 : 여러 개의 코루틴을 함께 사용하면 코드의 제어 흐름을 이해하기 어려워지고 관리가 복잡해질 수 있다. 
  2. 디버깅 : 일반적인 동기코드보다 디버깅이 어려워질 수 있다. 코드 실행이 비동기적으로 이루어지기 때문에 어떤 코루틴이 현재 실행되고 있는지 추적하기가 어렵다. 
  3. 메모리 관리 : 코루틴은 실행 중인 상태를 저장하기 위해 추가적인 메모리를 필요로 한다. 
  4. 성능 : 일반적으로 스레드보다 성능이 낮을 수 있다. 코루틴은 단일 스레드에서 실행되며, 코루틴 사이의 상호작용은 락 및 언락으로 인해 오버헤드가 발생할 수 있다. 따라서 성능이 중요한 부분에서는 코루틴 사용을 지양하는 것이 좋다. 

 

'Unity' 카테고리의 다른 글

[Unity] 열거자 인터페이스 (IEnumerator)  (0) 2023.05.13
[C#] 프로퍼티란 무엇인가?  (0) 2023.05.13