⏰ 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개는 다 알고있었지만 쓰기만하고 잘 알지는 못했었다. 이번 기회로 더 잘 사용하고 언제 사용할지에대해 알게된거같다!! 실제로 많이 써봐야지..그래야 실력이 늘지 ㅠㅜ
'Unity' 카테고리의 다른 글
Unity - Unity의 메인 카메라(Main Camera) & Projection (3) | 2025.08.04 |
---|---|
Unity - Unity Instantiate() 오버로드 정리 & 자식으로 설정할 때의 차이 (2) | 2025.07.28 |
Unity - Unity Coroutine(코루틴) (2) | 2025.07.28 |
Unity - Unity MonoBehaviour 생명주기 (Lifecycle) 정리 (2) | 2025.07.28 |
Unity - Collider2D의 Layer Overrides(Include Layers, Exclude Layers) 알아보기 (0) | 2025.07.25 |