유니티 코루틴 (Coroutine)

김찬수·2023년 5월 11일
0

Unity

목록 보기
6/15

코루틴

일시중지 - 재개가 가능한 함수

Iterator Method로 구현이 되어 있음

작업을 여러 프레임으로 쪼개야 하는데, 코루틴이라는 기능이 없다면 프레임의 흐름이나 시간의 흐름을 계산하면서 구현해야 하기 때문에 코드 자체가 복잡해짐

MonoBehaviour.StartCoroutine()으로 코루틴을 시작할 수 있음

코루틴은 부착된 게임오브젝트가 비활성화 될 때 자동으로 중단됨

  • MonoBehaviour.StopCoroutine()으로 수동으로 중단시킬 수도 있음

가비지 생성

  • Coroutine / Yieldlnstruction / IEnumerator

IEnumeratorReset()이 불가능하기 때문에 반복적으로 사용하려면 아래와 같이 사용

IEnumerator _testCoroutine;

    private void Start()
    {
        _testCoroutine = TestCoroutine();
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            // 2번째부터는 동작을 안함
            StartCoroutine(_testCoroutine);
        }
    }

    IEnumerator TestCoroutine()
    {
        while (true)
        {
            Debug.Log("시작");
            yield return new WaitForSeconds(0.3f);
            Debug.Log("끝");

            StopCoroutine(_testCoroutine);
            yield return null;
        }
    }

반복해서 계속 사용하기 위해서 while문 사용

하지만 위와 같은 방식은 가독성이 떨어짐

위와 같은 문제 때문에 Unitask를 사용할 수 있음
Unitask 설명과 사용법 예시 잘 정리해놓은 블로그

코루틴을 사용하는 상황

Update가 아닌 곳에서 반복적으로 코드가 실행되어야 할 필요가 있을 때

Update문은 프레임마다 계속 반복적으로 실행되지만, 코루틴은 필요한 순간에만 반복하고 필요하지 않을 때에는 전혀 사용하지 않음으로써 자원관리를 효과적으로 할 수 있음

당장 실행되는것이 아니라 일정 시간동안 멈춰있다가 그 뒤에 동작하게 하거나, 특정 조건을 부여해서 코드가 실행되도록 할 수도 있음

만약 Update문에 반복문을 작성하게 되면 해당 반복이 끝날 때까지 반복문 아래에 있는 코드들은 전혀 실행이 되지 않지만, 코루틴에서 반복문을 사용하면 Update와는 별도로 동작하기 때문에 모든 스크립트를 정상적으로 동작시킬 수 있음

코루틴 사용법

코루틴은 IEnumerator라는 반환형으로 시작해야함

yield return이 반드시 함수 내부에 존재해야함

아래와 같이 함수를 선언해주고, StartCoroutine함수로 호출해주면 됨

IEnumerator 함수이름()
{
	yield return // +조건
	// 함수 내용
}

yield return의 종류

yield return null; : 다음 프레임에 실행됨

yield return new WaitForSeconds(float); : 매개변수로 입력한 숫자에 해당하는 초만큼 기다렸다가 실행됨
(유니티에서의 시간을 기준으로 체크하기 때문에 TimeScale에 영향을 받음)

yield return new WaitForSecondsRealtime(float); : 매개변수로 입력한 숫자에 해당하는 초만큼 기다렸다가 실행됨
(현실의 시간을 기준으로 체크하기 때문에 TimeScale에 영향을 받지 않음)

yield break; : yield break문을 만나면 코루틴이 바로 끝남

이 외에도 yield return + new WaitForFixedUpdate / WaitForEndOfFrame 등 여러가지 사용법이 존재함

초보 개발자가 기억이 나지 않을 때 꺼내어 보기 위해 기록하는 공간입니다. 틀린 점이 있다면 댓글로 알려주시면 정말 감사하겠습니다.

profile
프로그래머 지망생

0개의 댓글