- 일반적으로 100만의 for문이 존재하는데 그것을 다 실행하지 않고, 1만 마다 잠시 쉬었다가 다시 실행해주는 c#의 아주 좋은 기능이 있다 그것은 coroutine이다.! 아래의 예제를 보자 yield를 이용해서 미룰 수 있다.
예제
class Test
{
public int Id = 0;
}
// coroutine에서 특정 tick에서 멈췄다가 다시 실행하거나 이런 것들을 가능하게 한다.
// 함수의 상태를 저장 . 복원 가능
// 원하는 타이밍에 함수를 잠시 stop / 복원하는 경우
// return -> 우리가 원하는 타입으로 가능하다 class도 가능하다
class CoroutineTest : IEnumerable
{
public IEnumerator GetEnumerator()
{
for (int i = 0; i < 100000; i++)
{
if (i % 100 == 0)
yield return null; // coroutine의 잠시 멈추는 느낌.
}
}
//매번 4초를 위해서 이렇게 매순간을 확인하는 것은 낭비이다.
// 중앙의 한 곳에 관리하도록 두면서 event를 던지고 4초가 되면 알아서 알려주면 아주 좋다.
// 이럴 때 코루틴이 굉장히 유용하게 사용된다.
private float deltaTime = 0;
void ExplodeAfter4Seconds()
{
deltaTime += Time.deltaTime;
if (deltaTime >= 4)
{
//로직..
}
}
}
foreach (System.Object t in Test) // !!
{
int value = (int)t;
Debug.Log(value);
}
예제2
- 코루틴을 사용하면 가령 게임에서 기를 n초동안 모았다가 발생하는 것도 구현이 가능하다 아래의 예시를 살펴보자!
public class Test : MonoBehaviour
{
public Coroutine co;
public void Init()
{
co = StartCoroutine("ExplodeAfterSeconds", 4.0);
StartCoroutine("CoStopExplode", 2.0);
}
IEnumerable CoStopExplode(float seconds)
{
yield return new WaitForSeconds(seconds);
Debug.Log("Stop Excute!!!");
if (co != null)
{
StopCoroutine(co);
co = null;
}
}
IEnumerable ExplodeAfterSeconds(float seconds)
{
Debug.Log("Explode Enter");
yield return new WaitForSeconds(seconds);
Debug.Log("Explode Excute!!!");
co = null;
}
}
일단 유니티에서 코루틴을 사용하려면 MonoBehaviour를 상속 받아야한다, 또한 IEnumberable을 반환해야한다 여기서 IEnumberable은 멀까 반한을 할 때 클래스도 가능하다 모든 타입을 다 받아주는 것같다..
코루틴을 시작할 때 StartCoroutine으로 가능하다 첫번째인자는 보듯이 함수명을 적고, 두번째는 인자를 넘겼다, 코루틴을 멈춰주는 함수도 존재한다 StopCoroutine
위의 함수에서 StartCoroutine으로 폭발함수를 코루틴을 실행하다가 4초가 되면 yiled return 이 되면서 4초후에 yiled밑의 라인이 실행된다. 실행할 때 StartCoroutine("CoStopExplode", 2.0);도 같이 실행하면 stop Excute를 실행후 null이 아니면 null처리 후 StopCoroutine을 실행한다..