본문 바로가기
게임 프로그래밍/유니티(2021.3 LTS) 강좌

[유니티 기초] 코루틴 (Coroutine)

by 레오란다 2022. 10. 26.
반응형

유니티 스크립트에서 일반 함수와 코루틴의 차이는 다음과 같습니다.

 

일반 함수 → 함수가 호출된 현재 프레임에서 함수의 내용을 모두 처리

코루틴 → 여러 프레임에 걸쳐 처리

 

코루틴에서는 "yield return ..." 구문을 만나면 여기서 제시된 조건 동안 코드 수행의 제어권을 유니티에게 반환하고 코루틴 함수는 잠시 중단됩니다. 이후 다른 프레임에서 중단된 코드를 이어서 수행할 수 있게 됩니다. (조건에 대한 자세한 내용은 이글의 하단에 있습니다.)

 

 

코루틴 함수는 다음과 같은 규칙으로 사용할 수 있습니다.

 

  • IEnumerator 라는 반환 값을 갖는 함수로 작성해야 합니다.
  • 코루틴 함수 내부에 반드시 yield 키워드가 한 번 이상 사용되어야 합니다.
  • 코루틴 함수는 StartCoroutine 을 사용해 호출해야 합니다.

 

프리팹 기초 강의에서 사용했던 코드 중 코루틴과 관련된 코드를 예제로 사용해 보도록 하겠습니다.

 

void Start()
{
  StartCoroutine(SpawSlime());
}

IEnumerator SpawnSlime()
{
  while (Application.isPlaying)
  {
     Vector3 p = Random.insideUnitSphere * 25;

     Vector3 pos = new Vector3(p.x, 0f, p.z);
     var slime = Instantiate(slimePrefab, pos, Quaternion.identity);

     yield return new WaitForSeconds(1f);
  }
}

 

▶ SpawnSlime은 코루틴 함수 입니다. 

 

 yield return 다음에 올 수 있는 구문의 종류는 다음과 같습니다.

  • null :  다음 프레임의 Update() 가 호출이 종료될 때까지 대기
  • new WaitForEndOfFrame() :  현재 프레임이 종료될 때까지 대기
  • new WaitForFixedUpdate() :  다음 프레임의 FixedUpdate() 가 호출이 종료될 때까지 대기
  • new WaitForSeconds(sec) :  인자로 넘겨주는 시간(초) 동안 대기 (1f = 1초). Time.timeScale의 영향을 받습니다.
  • new WaitForSceondsRealtime(sec) :  인자로 넘겨주는 시간(초) 동안 대기. Time.timeScale의 영향을 받지 않습니다.
  • new WaitUntil(statement) :  statement 가 true 가 될 때까지 대기
  • new WaitWhile(statement) :  statement 가 true 인 동안 대기
  • StartCoroutine() :  다른 코루틴 함수를 실행하고 해당 코루틴이 종료될 때까지 대기합니다.

 

위의 코드에서 yield return WaitForSeconds(1f) 구문이 실행되면 여기서 1초 동안 코루틴 함수가 중단됩니다. 그 동안 유니티는 다른 처리를 수행하게 됩니다. 1초 후에는 다시 코루틴 함수의 다음 내용이 수행됩니다.이 코드에서는 while 문의 조건을 다시 검사하는 코드가 수행됩니다.

 

코루틴은 시간 혹은 프레임에 따라 점진적으로 처리되어야 하는 작업에 유용하게 사용할 수 있습니다.

 

반응형

댓글