Invoke 함수와 코루틴

Noke·2025년 3월 24일

Unity TIL

목록 보기
4/31
post-thumbnail

이번에 내일배움캠프 강의를 들으면서, 코루틴과 비슷한 Invoke() 함수를 사용해 보았다. 아래는 그 예시이다.

void Start() 
{
    Invoke("PrintMessage", 2f); // 2초 후에 PrintMessage() 한 번 실행
}

void PrintMessage() 
{
    Debug.Log("2초 지남!");
}

위 예시를 보면, Invoke() 함수의 사용 방법을 알 수 있다. 특이한 점은 메서드의 이름을 문자열로 받는다는 것이다.

코루틴과 비슷한 성격을 가진 함수는 InvokeRepeating() 함수다.

void Start()
{
    InvokeRepeating("MakeSquare", 0f, 1f);
}

void MakeSquare()
{
    Instantiate(square);
}

위의 InvokieRepeating() 함수는 직사각형을 소환하는 함수인 MakeSquare()를 0초부터 시작해서 1초마다 반복한다. 코루틴보다 더 직관적으로 사용할 수 있어 보인다. 그러면, 어째서 유니티에서는 코루틴을 더 많이 사용하는 것일까?

먼저, Invoke() 함수에서는 매개변수를 가지고 있는 메서드를 전달할 수 없다. 반면에, 코루틴은 매개변수와 함께 메서드를 직접 전달할 수 있다. 이를 통해, 복잡하지만 유연한 처리가 가능하다.

그리고, Invoke() 함수보다 코루틴을 사용하는 것이 성능면에서 더 좋다. Invoke() 함수는 내부적으로 C#의 리플렉션이라는 기능을 사용하여 프로그램 실행 도중에 해당하는 메서드를 호출, 접근할 수 있다. 그러나 이 기능은 사용자 입장에서는 매우 좋지만, 느린 편이다. 그러나, 코루틴은 적절하게 사용할 경우 성능에 큰 영향을 끼치지 않는다.

따라서, 단순한 지연이 필요한 단일 호출, 그리고 매개변수가 없는 경우에는 Invoke() 함수를 사용고, 파라미터를 전달해야 하거나 복잡한 흐름 제어가 필요한 경우에는 코루틴을 사용하는 것이 더 적합하다.

마지막으로, 코루틴의 예시를 보여주면서 포스팅을 마무리하겠다.

IEnumerator ExampleCoroutine(int value)
{
    yield return new WaitForSeconds(2f);	//원하는 시간만큼 기다림, 여기서는 2초
    Debug.Log("Received value: " + value);
}

void Start()
{
    StartCoroutine(ExampleCoroutine(5));	//코루틴은 매개변수를 받을 수 있음
}
profile
유니티 개발자(진)

0개의 댓글