본문 바로가기
unity

coroutine

by kcj3054 2022. 7. 9.
  • 일반적으로 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을 실행한다..

'unity' 카테고리의 다른 글

UI  (0) 2022.07.10
raycast  (0) 2022.07.10
0708  (0) 2022.07.08
state 패턴.  (0) 2022.07.08
이동.  (0) 2022.07.07