유니티는 단일 쓰레드로 동작한다. 하지만 코루틴을 사용하면 쓰레드를 사용하지 않고 멀티 태스킹을 구현 할 수 있다. C#에서 이터레이터는 프로그래머가 IEnumerator 를 구현할 수있도록 돕는 기능이다. 열거형의 MoveNext() 를호출 할 때마다. 해당하는 다음 값을 반환한다. 일반적으로 함수가 호출되서 끝나는 서브루틴의 개념과 달리 yield return 을 사용함으로써 그 위치를 기억하고 다음 호출 때 그곳부터 다음을 실핼 할 수있도록 하는 것이다. 그래서 여러개의 코루틴을 동작시키고 각기다른 시점에 yield가 반환되도록 한다면 마치 어러개의 쓰래드가 동시에 동작하는것과 같은 효과가 나타난다
아래의 예제는 코루틴을 실행할 때 함수를 직접 실행하는 방법과 함수의 이름 즉 스트링을 이용해 호출 하는 방법 두가지를 테스트 한다.
AAA(), BBB() 코루틴 함수는 1초마다 실행되며 2초 후에 코루틴은 멈추게 된다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
Coroutine coroutine1;
void Start()
{
// 코루틴 실행 방법 (함수)
// 파라미터를 여러 개 쓸 수 있다.
coroutine1 = StartCoroutine(AAA());
// 코루틴 실행 방법 (스트링)
// 성능상 함수로 호출하는 것보다 느리다.
// 파라미터를 1개만 쓸 수 있다.
StartCoroutine("BBB");
StartCoroutine(STOP());
}
IEnumerator AAA()
{
for(int i = 0; i < 10; i++)
{
print("i 의 값 = " + i);
// 1초 마다 호출 하게 된다.
yield return new WaitForSeconds(1f);
}
}
IEnumerator BBB()
{
for(int j = 0; j < 10; j++)
{
print("j 의 값 = " + j);
// 1초 마다 호출 하게 된다.
yield return new WaitForSeconds(1f);
}
}
IEnumerator STOP()
{
yield return new WaitForSeconds(2f);
StopCoroutine(coroutine1);
yield return new WaitForSeconds(2f);
StopCoroutine("BBB");
}
}
'프로그래밍 언어 > C#' 카테고리의 다른 글
C# 예외처리 (0) | 2019.12.05 |
---|---|
C# Action과 Func (0) | 2019.12.05 |
C# 람다식 (0) | 2019.12.05 |
C# 형식 매개변수 T (0) | 2019.12.05 |
C# 인덱서 (0) | 2019.12.05 |