[Unity] Coroutine함수 알아보기

권태형·2023년 9월 18일
0

Unity

목록 보기
8/9
post-thumbnail

Coroutine 이란?

Coroutine(코루틴)Unity에서 사용되는 비동기적인 코드 실행 방식 중 하나이다.

코루틴은 함수나 메서드가 동작 중에 중지되고 나중에 다시 시작할 수 있도록 해준다. 따라서 게임 루프나 프레임 업데이트와는 별도로 실행되며, 특정 조건이나 시간 지연을 기다리거나 순차적으로 여러 단계의 작업을 수행하는 데 사용 수 있다.

코루틴은 일반적으로 선언에서 IEnumerator 를 사용해서 함수를 선언하고, 반드시 return을 yield 키워드를 사용해야만 한다.

IEnumerator MyCoroutine() {
	yield return null
}

위와 같이 선언한 코루틴함수를 StartCoroutine() 함수를 이용해 호출하고 StopCoroutine()함수를 이용해서 원할때 정지시킨다.

✨주의점
이 코루틴 함수에서 코루틴을 멈추기 위해서는 호출과 멈춤을 모두 "" 문자열을 이용해서 맞춰주거나, 하나의 코루틴일 경후 전부 멈추거나, 코루틴자체를 변수에 담은 후에 멈춰주어야만 동작한다.

이유는 모르겟지만, 메뉴얼에서 코루틴 함수 내 호출할때 MyCoroutine()로 호출하면 StopCoroutine(MyCoroutine()아무리 사용해도 코루틴이 멈추지 않는 현상이 있다.

StartCoroutine("MyCoroutine")
StartCoroutine(MyCoroutine())

StopCoroutine("MyCoroutine")
StopAllCoroutine()

Coroutine의 장점!

  • 비동기 작업 처리

    • 코루틴을 사용하면 게임 로직을 비동기적으로 처리할 수 있으며, 작업을 병렬로 실행하거나 지연시킬 수 있다.
  • 프레임 업데이트 분리

    • 코루틴을 사용하면 프레임 업데이트와 독립적으로 작업을 수행할 수 있으므로 게임 루프에 영향을 주지 않는다.
  • 복잡한 상태 머신 구현

    • 코루틴을 활용하여 게임 상태 머신을 쉽게 구현할 수 있으며, 게임의 다양한 상황에 대응할 수 있다.

Coroutine의 여러가지 사용방법

코루틴 함수에서 특히나 특수한 상황을 만들 수 있게 해주는 부분이 yield return 이후 나오는 함수이다.

  • yield return null : 다음 프레임까지 대기한다. 주로 간단한 지연이 필요한 경우에 사용된다.
    yield return null; // 1프레임 대기
  • yield return WaitForSeconds(float seconds) : 지정한 시간(초) 동안 대기한다.
    yield return new WaitForSeconds(2.0f); // 2초 대기
  • yield return new WaitForFixedUpdate(): 다음 FixedUpdate까지 대기한다. 보통 물리 시뮬레이션과 관련된 작업을 수행할 때 사용된다.
    yield return new WaitForFixedUpdate(); // 다음 FixedUpdate까지 대기
  • yield return new WaitForSecondsRealtime(float seconds) : 지정한 시간(초) 동안 대기하되, 게임 시간이 멈춰있어도 대기한다. 실제 경과 시간과 상관없이 시간을 기준으로 대기한다.
    yield return new WaitForSecondsRealtime(2.0f); // 실제 경과 시간과 상관없이 2초 대기
  • yield return StartCoroutine(IEnumerator coroutine): 다른 코루틴을 실행하고, 해당 코루틴이 완료될 때까지 대기한다.
    yield return StartCoroutine(SomeOtherCoroutine()); // 다른 코루틴 실행 후 완료 대기
  • yield return new WaitUntil(Func<bool> predicate): 지정한 조건(predicate)이 true가 될 때까지 대기한다.
     yield return new WaitUntil(() => playerHealth <= 0); // 플레이어 체력이 0 이하일 때까지 대기
profile
22년 12월 개발을 시작한 신입 개발자 ‘권태형’입니다. 포스팅 하나하나 내가 다시보기 위해 쓰는 것이지만, 다른 분들에게도 도움이 되었으면 좋겠습니다. 💯컬러폰트가 잘 안보이실 경우 🌙다크모드를 이용해주세요.😀 지적과 참견은 언제나 환영합니다. 많은 댓글 부탁드립니다.

0개의 댓글