메인 루틴과 서브루틴
먼저 코루틴을 알아보기 전에 메인 루틴과 서브루틴이
무엇인지 간략하게 소개하고 넘어 가도록 하겠다.
우선 메인루틴(Main-routine)은
우리가 익히 잘 알고 있는 유니티 내부의
Start, Update 함수 등을 지칭한다
다음으로 서브루틴(Sub-routine)은
어떠한 작업을 처리하기 위해
사용자가 직접 만든 함수 등을
서브 루틴이라고 부른다
보통, 서브루틴이 메인 루틴에 종속된
상태로 호출받는 입장으로, 서브루틴에서
반환 값이 있다면 그 값을 이용하는 방식이다.
코 루틴(Co-routine)
코 루틴은 호출한 메인 루트와 함께 실행되는
방식이다, 여기서 Co-routine의 'Co'는 '동등한',
'협력관계'의 의미이기도 한다
코 루틴의 선언 방식은 아래와 같다
using System.Collections;
using UnityEngine;
public class TestCoroutine : MonoBehaviour
{
private IEnumerator Test()
{
yield return null;
}
}
이처럼 코 루틴은 함수의 반환 타입을 IEnumerator 인터페이스를
사용해야 되며, 무조건 하나 이상 yield return 구문을 써주어야 한다
코 루틴에서의 내부 기능을 실행하다가, yield return 구문을 만나게 되면
yield return 구문으로 지정한 명령어에 맞게 실행하고, 다시 코 루틴을
호출한 루틴으로 제어권을 넘기게 되는데 null 은 1 프레임을 호출자에게
양보해준다는 뜻이며, yield return 구문으로 지정한
명령어는 null 뿐만이 아닌 다양하게 존재한다.
만약 1 프레임이 아닌 5초 동안 제어권을 넘겨주고 싶다면
using System.Collections;
using UnityEngine;
public class TestCoroutine : MonoBehaviour
{
private IEnumerator Test()
{
yield return new WaitForSeconds(5.0f);
}
}
이런 식으로 yield return 구문 뒤에 null이 아닌 WaitForSeconds라는
클래스 형식에 대기시간을 인자로 넘겨 new로 할당해준다
이렇게 하면 실행 제어권을 5초간 넘기게 되고
5초가 지나게 되면 중단된 코드 위치로 복귀하여
코 루틴 함수의 작업을 이어가게 된다.
이처럼 함수가 시작되는 위치를
진입 지점(Entry Point)라고 하는데
코 루틴이 서브루틴과의 결정적인 차이점이라 함은
호출될 때마다 처음부터 다시 실행되는 진입지점이
하나인 서브루틴과는 달리 코 루틴은 진입 지점을
여러 개 정의할 수 있는 것이다.
아래는 코 루틴에서 사용하는 반환 타입의 목록이라 할 수 있다
null | 다음 프레임까지 대기 |
new WaitForSeconds(float) | 지정한 초만큼 대기 |
new WaitForFixedUpdate() | 다음 물리 프레임까지 대기 |
new WaitForEndOfFrame() | 모든 렌더링 작업이 끝날 때까지 대기 |
StartCoroutine(string) | 코루틴이 끝날 때까지 대기 |
new WWW(string) | 웹 통신 작업이 끝날 때까지 대기 |
new AsyncOperation | 비동기 작업이 끝날 때까지 대기 |
사실 이중 가장 자주 쓰이는 것은 null, WaitForSeconds, StartCoroutine
정도로 나머지 반환 타입 목록들은 필요할 때 알아봤으면 한다.
이를 토대로 Hello를 출력시키는 코 루틴 함수를 만들어
실행시키는 순서까지 보여주도록 하겠다.
using System.Collections;
using UnityEngine;
public class TestCoroutine : MonoBehaviour
{
void Start()
{
StartCoroutine(Test());
}
private IEnumerator Test()
{
Debug.Log("Hello");
yield return new WaitForSeconds(5.0f);
Debug.Log("Hello");
}
}
한 가지 주의할 점은 코 루틴 함수는 일반적인 서브루틴
함수처럼 호출하는 것이 아닌 MonoBehaviour 클래스
내부에 존재하는 StartCoroutine 함수의 도움을
받아 호출하는 것이다. (매개 변수로 위처럼 함수로
전달할 수 있지만 문자열 형식으로도 전달 가능)
자 그럼 위의 코드를 보고 출력 결과를 예상해보자
정답은 시작과 동시에 콘솔 창에 Hello 문구가 표시되고
5초 후에 다시 Hello 문구가 표시되는 것을 확인할 수 있다.

한번 직접 실행해 봤으면 한다
기타 활용 방안
using System.Collections;
using UnityEngine;
public class TestCoroutine : MonoBehaviour
{
IEnumerator Start()
{
yield return StartCoroutine(Test());
yield return StartCoroutine(Test2());
Debug.Log("End");
}
private IEnumerator Test()
{
Debug.Log("Hello");
yield return new WaitForSeconds(5.0f);
Debug.Log("Hello");
}
private IEnumerator Test2()
{
Debug.Log("World");
yield return new WaitForSeconds(5.0f);
Debug.Log("World");
}
}
이런 식으로 Start함수의 반환 형식을 IEnumerator 형식으로 변환시킬 수 있다.
여기서 yield return StartCoroutine() 은 약간 생소할 수 있는데 설명하자면
해당 코 루틴 함수 자체가 종료지점에 도달할 때까지 기다린다는 것이다.
한번 코드를 넣고 실행시켜보면 무슨 뜻인지 알게 될 것이다.
이 외에도
using UnityEngine;
public static class Util
{
public static readonly WaitForSeconds delay01 = new WaitForSeconds(0.1f);
public static readonly WaitForSeconds delay02 = new WaitForSeconds(0.2f);
public static readonly WaitForSeconds delay03 = new WaitForSeconds(0.3f);
}
이렇게 자주 사용하는 yield return 구문들은 잦은
new 할당으로 인해 힙 영역에 부담이 가므로
미묘한 성능 차이가 나더라도 이런 식으로
캐싱해서 최적화하는 편이다.
참고로 readonly는 런타임 상수다
이처럼 코 루틴은 하나의 프로세스 내에서
여러 루틴들이 시간을 나눠서 사용하는
비동기 방식 중 하나이다
앞서 동기, 비동기 방식의 차이를 모른다면
아래 내가 올린 글을 참고하길 바란다
[C#] 비동기 프로그래밍(Asynchronous Programming) 에 대해 알아보자
동기, 비동기 프로그래밍 동기 프로그래밍(Synchronous Programming)은 프로그램이 실행되는 도중 어떤 작업 요청이 들어오면 해당 작업이 종료될 때까지 기다렸다가 다음 작업을 하는 것을 의미 하고
plugxp.tistory.com
여기에선 async, await를 활용하여 함수를
사용하는 방식을 설명해주는데
코 루틴과 같은 비동기 방식이더라도 각각의
장단점이 존재하기 마련이다
필자가 이 둘을 써보면서 직접 느낀 것은
코 루틴 같은 경우 사용하기에 매우 좋지만
예외 처리가 안되고, 리턴이 불가능하다는 점이
아쉬웠다, 그리고 코 루틴은 Monobehaviour를
상속받는 클래스 내부에서만 StartCoroutine을 이용하여
호출이 가능해서 따라서 따로 리턴이 필요하거나
MonoBehaviour를 상속받지 않은 클래스에서
비동기 작업을 필요로 할 때 async를 주로 사용하였다.
이 외에도 코 루틴을 이용한 다양한 활용방안들이 있으니
아래 레퍼런스 사이트나 유니티 공식 홈페이지 등에서
자료를 찾아보길 바란다.
레퍼런스 사이트
https://docs.unity3d.com/kr/530/Manual/Coroutines.html
유니티 - 매뉴얼: 코루틴(Coroutine)
게임 오브젝트 생성 및 삭제 특수 폴더와 스크립트 컴파일 순서 코루틴(Coroutine) 함수를 호출하면 반환값을 반환하기 전에 실행 완료됩니다. 즉, 함수에서 수행되는 작업은 하나의 프레임에서 수
docs.unity3d.com
https://docs.unity3d.com/Manual/Coroutines.html
Unity - Manual: Coroutines
Coroutines A coroutine allows you to spread tasks across several frames. In Unity, a coroutine is a method that can pause execution and return control to Unity but then continue where it left off on the following frame. In most situations, when you call a
docs.unity3d.com
'Unity > 지식' 카테고리의 다른 글
[Unity] 좌표계 에 대해 알아보자 (0) | 2022.01.13 |
---|---|
[Unity] 쿼터니언과 짐벌락 현상에 대해 알아보자 (0) | 2022.01.05 |
[Unity] Attribute 에 대해 알아보자 (0) | 2021.12.21 |
[Unity] 라이프 사이클(Life Cycle) 에 대해 알아보자 (0) | 2021.12.20 |
[Unity] Delta Time 에 대해 알아보자 (0) | 2021.12.19 |