코루틴 정의
C언어 등에서 일반적으로 사용하는 함수는 시작할 때 진입하는 지점이 하나 존재하고 함수가 모두 실행되거나, return 구문에 의해 종료되는 지점을 설정할 수 있다. 이러한 함수를 Subroutine(서브루틴)이라 부르는데, 코루틴은 이를 더 일반화한 개념으로 진입하는 시점까지 여러 개를 가질 수 있는 함수를 의미한다.
- 장점
- 일반적으로 게임에서 코루틴을 사용하지 않는다면 매 프레임마다 Update구문에서 동작을 확인해야하는 상황이 발생한다. 코루틴은 지정한 시간이 지난 후에 자동으로 확인된다. 이러한 점 때문에 특히 모바일 기기에서 코루틴의 활용은 성능 향상에 큰 영향을 미친다.
- 코드 가독성이 좋아진다.
- 특성
- 특정 작업을 단계적으로 발생하게 한다.
- 시간 흐름에 따라 발생하는 루틴을 작성할 수 있다.
- 다른 연산이 완료될때까지 기다리는 루틴을 작성할 수 있다.
- 비동기가 아니다. = 동시에 발생하지 않는다.
코루틴 중단하기
public class CoroutineTest : MonoBehaviour
{
IEnumerator enumerator;
void Start()
{
// 코루틴 함수를 직접 호출해서 중단시키려면 IEnumerator를 저장해서 사용
enumerator = TestCoroutine();
StartCoroutine(enumerator);
}
void Update()
{
if(Input.GetKeyDown(KeyCode.Space))
{
// 코루틴 함수를 직접 호출해서 중단시키려면 IEnumerator를 저장해서 사용
StopCoroutine(enumerator);
}
}
IEnumerator TestCoroutine()
{
int i = 0;
while(true)
{
yield return null;
Debug.Log("Coroutine " + i);
i++;
}
}
}
코루틴 함수를 문자열 파라미터로 호출하기
어떤 면에서 보면 코루틴의 이름으로 코루틴을 시작하고 멈추는 방법이 더 낫다고 여길 수도 있다. 하지만 한 오브젝트에서 같은 이름의 코루틴이 2개 이상 실행되고 있는 상태에서 코루틴의 함수 이름 문자열로 StopCoroutine을 호출하면 이름으로 실행된 모든 코루틴이 동시에 멈춰버린다.
StartCoroutine(TestCoroutine()); // 코루틴 함수를 호출해서 실행한 코루틴은
StopCoroutine("TestCoroutine"); // 코루틴 이름 문자열로 중단시킬 수 없음
모든 코루틴 동시에 중단시키기
StopAllCoroutines();
yield break
yield return을 사용할 ReturnCoroutine과 yield break를 사용할 BreakCoroutine을 만든다. 이 두 코루틴을 실행하면ReturnCoroutine은 Return 1과 Return 2가 모두 출력되지만 BreakCoroutine에서는 Break 1만 출력되고 Break 2는 출력되지 않는 것을 볼 수 있다. yield break가 호출된 순간에 코루틴 함수가 완전히 멈춰버린 것이다. yield return은 코드의 제어권을 유니티 엔진에 잠시 넘겼다가 특정 시점이 되면 다시 받아서 코드를 진행하지만 yield break는 그 시점에 코루틴을 완전히 멈춰버린다. 코루틴 내부에서 특정 조건을 만족하면 yield break로 코루틴을 멈추는 방식으로 사용할 수 있다.
IEnumerator ReturnCoroutine()
{
Debug.Log("Return 1");
yield return null; // 코드의 제어권을 잠시 양보했다가 돌려받아서 아래 코드를 계속 진행
Debug.Log("Return 2");
}
IEnumerator BreakCoroutine()
{
Debug.Log("Break 1");
yield break; // 코루틴 함수를 이 시점에 종료
Debug.Log("Break 2");
}
코루틴 함수에 매개변수 전달하기
IEnumerator TestCoroutine(int count)
{
int i = 0;
while(i < count)
{
yield return null;
Debug.Log("Coroutine " + i);
i++;
}
}
코루틴 이름 문자열로 코루틴을 실행시키면서 매개변수를 받는 StartCoroutine의 오버로드 형식은 string으로 코루틴 함수의 이름을 받고 object 타입으로 매개변수를 받는다.
Coroutine StartCoroutine(string methodName, object value); // 원본
StartCoroutine(TestCoroutine(10));
StartCoroutine("TestCoroutine", 10);
코루틴 함수 문자열 실행 방식의 약점
박싱/언박싱의 오버헤드
// 박싱(Boxing)
int i = 10;
object obj = i;
// 언박싱(Unboxing)
int j = (int)obj;
전달 가능한 매개변수의 개수
IEnumerator TestCoroutine(int count, float time)
{
yield return new WaitForSeconds(time);
int i = 0;
while(i < count)
{
yield return null;
Debug.Log("Coroutine " + i);
i++;
}
}
코루틴 함수의 이름으로 호출하는 방식에서는 매개변수를 전달할 object가 하나 뿐이라 두 번째 매개변수를 전달할 방법이 없다. 따라서 에러가 뜬다
StartCoroutine(TestCoroutine(10, 3f));
출처 : https://wergia.tistory.com/226
출처: https://3dmpengines.tistory.com/2035 [3DMP:티스토리]