반응형

⏰ Unity Invoke() vs Coroutine 비교 정리

Unity에서 일정 시간 이후에 어떤 작업을 수행하려면 보통 Invoke()나 Coroutine을 사용한다.
둘 다 **시간 지연(delay)**을 다룰 수 있지만, 구조와 활용도에는 큰 차이가 있다.

이 글에서는 두 방법의 차이점, 장단점, 실제 사용 예시를 함께 정리한다.


🔹 1. Invoke()란?

Invoke()는 지정한 시간 후에 단 한 번 특정 함수를 호출하는 Unity 내장 함수다.

✅ 사용법

void Start()
{
    Invoke("DelayedFunc", 2f); // 2초 후 DelayedFunc 실행
}

void DelayedFunc()
{
    Debug.Log("2초 후 실행됨");
}

🔹 2. Coroutine이란?

Coroutine은 시간의 흐름에 따라 동작을 일시정지하고 다시 재개할 수 있는 기능이다.
IEnumerator를 반환하고, yield return을 통해 흐름을 제어한다.

✅ 사용법

void Start()
{
    StartCoroutine(DelayedCoroutine());
}

IEnumerator DelayedCoroutine()
{
    yield return new WaitForSeconds(2f);
    Debug.Log("2초 후 실행됨 (코루틴)");
}

🔍 차이점 비교

항목 Invoke() Coroutine()
기본 개념 일정 시간 후 한 번 함수 호출 흐름을 일시정지하고 재개
지연 시간 제어 고정된 1회성 딜레이 반복/조건 기반 다양하게 제어 가능
정지 조건 CancelInvoke() 호출 시 StopCoroutine() 호출 시
복잡한 로직 처리 ❌ 불가능 ✅ 가능 (반복, 조건대기 등)
가독성 간단한 작업에 유리 반복 동작일 땐 더 명확함
타이밍 유연성 낮음 높음
Time.timeScale 영향 ✅ 받음 ✅ 받음 (WaitForSeconds)

🛑 Invoke 정지 예시

▶ 전체 코드

using UnityEngine;

public class InvokeStopExample : MonoBehaviour
{
    void Start()
    {
        // 5초 후에 GameOver()를 실행하려고 예약
        Invoke("GameOver", 5f);

        // 2초 뒤에 취소
        Invoke("CancelGameOver", 2f);
    }

    void GameOver()
    {
        Debug.Log("🟥 Game Over!");
    }

    void CancelGameOver()
    {
        Debug.Log("🟨 Game Over 예약 취소");
        CancelInvoke("GameOver");
    }
}

📝 요약

  • Invoke("GameOver", 5f)로 예약 
  • 2초 후 CancelInvoke("GameOver")로 중단
  • 결국 GameOver()는 실행되지 않음

🛑 Coroutine 정지 예시

▶ 전체 코드

using UnityEngine;
using System.Collections;

public class CoroutineStopExample : MonoBehaviour
{
    private Coroutine attackRoutine;

    void Start()
    {
        attackRoutine = StartCoroutine(DelayedAttack());
        Invoke("StopAttack", 2f); // 2초 후 코루틴 중단
    }

    IEnumerator DelayedAttack()
    {
        Debug.Log("🟢 공격 준비...");
        yield return new WaitForSeconds(5f); // 5초 대기
        Debug.Log("🔴 공격 실행!");
    }

    void StopAttack()
    {
        if (attackRoutine != null)
        {
            StopCoroutine(attackRoutine);
            Debug.Log("🟨 공격 중단됨");
        }
    }
}

 

📝 요약

  • 5초 후 공격을 하려는 코루틴 실행
  • 2초 후 StopCoroutine()으로 중단
  • 결국 🔴 공격 실행!은 출력되지 않음

✅ 핵심 요약

항목 정지 방법
Invoke CancelInvoke("함수이름")
Coroutine StopCoroutine(코루틴변수) 또는 StopAllCoroutines()
 
오.. 지금 처음 알게된게 코루틴도 변수처럼 쓸수있는걸 처음 알았다...

🧪 예시 비교

🎯 예: 3초 후 공격 애니메이션 시작

✅ Invoke 방식

void Start()
{
    Invoke("StartAttack", 3f);
}

void StartAttack()
{
    animator.SetTrigger("Attack");
}

✅ Coroutine 방식

IEnumerator StartAttackCoroutine()
{
    yield return new WaitForSeconds(3f);
    animator.SetTrigger("Attack");
}

void Start()
{
    StartCoroutine(StartAttackCoroutine());
}

✅ 언제 어떤 걸 써야 할까?

상황 추천방식
단순하게 일정 시간 후 함수 실행 Invoke()
반복/조건 기반 대기 필요 Coroutine
시간 흐름에 따라 여러 동작을 연결해야 할 때 Coroutine
가독성이 중요한 짧은 로직 Invoke()
 

🧠 Tip: InvokeRepeating()도 있다!

InvokeRepeating()을 사용하면 일정 시간 간격으로 반복 실행도 가능하다.

InvokeRepeating("SpawnEnemy", 1f, 5f); // 1초 후부터 5초 간격으로 반복 실행

이 역시 코루틴의 while(true) + WaitForSeconds()로 대체 가능하지만, 매우 간단할 때는 편리하다.


🏁 결론

한 줄 요약
간단한 타이머 → Invoke() / 유연한 시간 흐름 제어 → Coroutine
 

Invoke()는 빠르고 간단하지만 제어력이 낮고, Coroutine은 더 복잡하지만 강력하다.
상황에 따라 적절히 선택하면 효율적인 Unity 개발이 가능하다.

 

🔁 Unity InvokeRepeating() 간단 정리

✅ 개념

InvokeRepeating()은 지정한 시간 후부터 일정 간격으로 함수를 반복 실행하는 Unity 내장 함수다.
Update()나 Coroutine 없이도 정기적인 타이머 기반 로직을 구현할 수 있다.


🧪 사용 예시

using UnityEngine;

public class RepeatExample : MonoBehaviour
{
    void Start()
    {
        // 2초 후부터 시작해서, 1초마다 Attack() 실행
        InvokeRepeating("Attack", 2f, 1f);
    }

    void Attack()
    {
        Debug.Log("🔥 공격 실행!");
    }
}

 


🛑 반복 중단

 
void StopAttack()
{
    CancelInvoke("Attack");
}

📌 요약 표

항목 설명
사용 함수 InvokeRepeating("함수이름", 지연시간, 반복간격)
중지 방법 CancelInvoke("함수이름") 또는 CancelInvoke()
실행 조건 MonoBehaviour가 활성화된 상태여야 실행됨
장점 매우 간단한 반복 호출에 적합
단점 복잡한 흐름 제어나 조건 분기에는 불리
 

✅ 언제 사용하면 좋을까?

사용 상황 적합 여부
단순한 반복 로직 (ex. 1초마다 이펙트 생성) 👍 매우 적합
조건에 따라 반복 중단/재개 👍 사용 가능 (with CancelInvoke)
복잡한 흐름 제어가 필요한 경우 ❌ Coroutine이 더 적합
 

🏁 결론

InvokeRepeating()은 초간단 반복 타이머를 구현할 때 매우 유용한 도구다.
단, 조건 제어나 흐름 조절이 필요하면 Coroutine으로 전환하는 것이 좋다.

 

원래 3개는 다 알고있었지만 쓰기만하고 잘 알지는 못했었다. 이번 기회로 더 잘 사용하고 언제 사용할지에대해 알게된거같다!! 실제로 많이 써봐야지..그래야 실력이 늘지 ㅠㅜ

반응형