본문 바로가기

개발/Unity, C#

Unity Invoke vs Coroutine

 

인보크 - 단순하게 메서드 호출의 딜레이가 필요할 때 쓰면 깔끔함 대신 처음 호출 당시 세팅이 유지됨

코루틴 - 좀 더 유연하게 사용할 수 있음

 

간단한 코드와 결과

 

private void Start()
{
    Debug.Log("Start : " + Time.time);
    StartCoroutine("PrintCoroutine");
    Invoke("PrintInvoke", 3f);
}
private void PrintInvoke()
{
    Debug.Log("PrintInvoke : " + Time.time);
}
private IEnumerator PrintCoroutine()
{
    yield return new WaitForSeconds(3f);
    Debug.Log("PrintCoroutine : " + Time.time);
}

 

단순하게 3초 후 실행되는 결과

 

private IEnumerator Start()
{
    Debug.Log("Start : " + Time.time);
    StartCoroutine("PrintCoroutine");
    Invoke("PrintInvoke", 3f);
    yield return new WaitForSeconds(1f);
    gameObject.SetActive(false);
    Debug.Log("Disable : " + Time.time);
}
private void PrintInvoke()
{
    Debug.Log("PrintInvoke : " + Time.time);
}
private IEnumerator PrintCoroutine()
{
    yield return new WaitForSeconds(3f);
    Debug.Log("PrintCoroutine : " + Time.time);
}

 

인보크는 해당 오브젝트가 꺼져도 실행되고 코루틴은 멈춤

 

private IEnumerator Start()
{
    Debug.Log("Start : " + Time.time);
    StartCoroutine("PrintCoroutine");
    Invoke("PrintInvoke", 3f);
    yield return new WaitForSeconds(1f);
    this.enabled = false;
    Debug.Log("Disable : " + Time.time);
}
private void PrintInvoke()
{
    Debug.Log("PrintInvoke : " + Time.time);
}
private IEnumerator PrintCoroutine()
{
    yield return new WaitForSeconds(3f);
    Debug.Log("PrintCoroutine : " + Time.time);
}

 

오브젝트가 아닌 컴포넌트를 disable 시켜도 둘 다 멈추지 않음

 

 

InvokeRepeating이라는 것도 있는데 이름처럼 그냥 반복해주는 것

 

개인적으론 굳이 코루틴 대신 쓰는 경우가 많지는 않은 듯

 

그리고 중지하려면 CancelInvoke을 사용해주면 됨

 

 

InvokeRepeating과 Coroutine을 백만 번 돌리면?

private IEnumerator Start()
{
    for (int i = 0; i < 1000000; i++)
    {
        InvokeRepeating("PrintInvokeRepeating", 3f, 0.5f);
    }
    for (int i = 0; i < 1000000; i++)
    {
        StartCoroutine("PrintCoroutine");
    }
}
private void PrintInvokeRepeating()
{
    int i = 0;
    i++;
}
private IEnumerator PrintCoroutine()
{
    yield return new WaitForSeconds(3f);
    WaitForSeconds wait = new WaitForSeconds(0.5f);
    while (true)
    {
        int i = 0;
        i++;
        yield return wait;
    }
}

코드에서는 스타트에서 같이 돌리는 것처럼 보이지만 실제론 따로 테스트해봄

 

결과

Coroutine

 

InvokeRepeating

 

차이가 나긴 하는데.... 실제 프로젝트에서 유의미하게 차이가 날 것인가는 잘 모르겠음

'개발 > Unity, C#' 카테고리의 다른 글

Unity UGUI Text에서 특정 단어의 위치 찾기  (0) 2019.09.12
Unity Update문에 대해서  (0) 2019.07.27
C# AES 암호화  (0) 2019.07.24
C# Enum 사용시 Garbage 문제  (0) 2019.07.16
Unity 2019 LWRP Camera Stacking  (0) 2019.07.14