Unity에서 딜레이를 주는 방법
현재 프로젝트에서 딜레이를 줘야 하는 상황이 많아 자세하게 공부했던 내용을 정리하고자 한다.
유니티에서 딜레이를 주는 방법은 크게 5가지가 있다.
- Coroutine을 이용한 딜레이
- Invoke를 이용한 딜레이
- 타이머를 사용하여 직접 구현하는 딜레이
- WaitForSecondsRealtime(실제 시간 기준 대기)
- Async / Await (C#의 비동기 함수를 이용한 딜레이)
이것들 중 주로 사용하는 방법은 1, 2번 방식이고, 가끔 3, 4번 방식을 이용하여 구현하기도 한다.
이것들을 자세하게 알아보자.
Coroutine을 이용한 딜레이
Coroutine이란
먼저 코루틴(Coroutine)에 대해 알아보자.
코루틴(Coroutine)은 유니티에서 비동기 처리를 간편하게 구현할 수 있는 강력한 도구이며, 특정 시간 동안 기다린 후 작업을 수행하거나 여러 프레임에 걸쳐 작업을 나눠 수행할 수 있도록 도와준다.
코루틴은 C#에서 IEnumerator를 반환하는 메서드로 구현되고, 유니티의 MonoBehaviour에서 StartCoroutine 메서드를 사용함으로써 실행된다.
코루틴의 기본 사용법
코루틴은 IEnumerator 타입을 반환하며, yield return 구문을 사용하여 지연을 준다.
void Start()
{
StartCoroutine(DelayTime());
}
IEnumerator DelayTime()
{
yield return new WaitForSeconds(2.0f); // 2초 동안 대기
Debug.Log("2초 후 호출됨");
}
yield 키워드의 활용
yield 키워드를 사용하여 다양한 형태로 딜레이를 처리하거나 특정 조건을 기다리게 할 수 있다.
- WaitForSeconds
- WaitForSeconds는 게임 시간(Time.timeScale)에 영향을 받는다.
- 만약 일시 정지된 상태(Time.timeScale = 0)인 경우에는 딜레이 타이머도 함께 멈춘다.
- WaitForSecondsRealtime
- 게임 시간(Time.timeScale)에 영향을 받지 않는다.
- 일시 정지된 상태(Time.timeScale = 0)에서 실시간으로 기다리고 싶은 경우에 사용.
- WaitUntil
- 특정 조건이 참이 될 때까지 대기한다.
- yield return new WaitUntil(() => Input.GetKeyDown(KeyCode.Space)); // 스페이스바가 눌릴 때까지 대기
- WaitWhile
- 특정 조건이 거짓이 될 때까지 대기한다.
- yield return new WaitWhile(() => isMoving); // isMoving이 false가 될 때까지 대기
- null
- 한 프레임을 기다릴 때 사용한다. 프레임 단위로 작업을 분리해야 할 때 사용한다.
- 사용 예로는 물체를 이동시킬 때 사용한다.
- yield return null; // 한 프레임 기다림
코루틴 종료하기
- StopCoroutine()을 사용
- StartCoroutine() 호출 시 참조를 저장한 후 StopCoroutine()로 넘겨 코루틴을 종료시킨다.
- yield break;를 사용
- 특정 조건에서 yield break; 으로 코루틴을 즉시 종료시킨다.
코루틴 참고 사항
- 사항 만약 자식 오브젝트가 코루틴을 수행 중인데, Parent가 비활성화된 경우 child의 코루틴은 자동으로 종료된다. 만약 Parent가 활성화될 때 child의 Coroutine이 다시 수행되길 원한다면 OnEnable() 메서드에서 코루틴을 실행한다.
- Coroutine은 멀티스레딩이 아니므로 메인 스레드에서 비동기 작업처럼 처리된다. 따라서 메인 스레드의 성능에 영향을 미친다.
- Coroutine 안에서 무한 루프를 실행할 경우 게임이 멈출 수 있다. 탈출 조건을 명확하게 설정해야 한다.
Invoke를 이용한 딜레이
1. Invoke
Invoke는 특정 함수의 실행을 지연시키는 간단한 방법이다. 딜레이를 위해 Invoke 메서드를 사용하면, 정해진 시간이 지난 후 특정 메서드를 호출할 수 있다.
기본적인 사용법
public void Invoke(string methodName, float time);
- MethodName: 호출하려는 메서드 이름(문자열)
- delayTime: 몇 초 후에 메서드를 호출할지에 대한 시간(단위 : 초)
만약 메서드 이름을 변경하거나 오타가 있는 경우 런타임에 오류가 발생한다. 또한 호출할 메서드는 반환값이 없는 메서드여야 한다.
2. InvokeRepeating
Invoke와 유사한 형태로 반복 호출을 지원하는 함수로는 InvokeRepeating이 있다.
기본적인 사용법
public void InvokeRepeating(string methodName, float time, float repeatRate);
- MethodName: 호출하려는 메서드 이름(문자열)
- delayTime: 처음 실행까지 대기할 시간(초)
- repeatRate: 몇 초마다 메서드를 반복 호출할지 설정(초)
주의할 점은 time, repeatRate은 Time.TimeScale에 영향을 받는다.
https://docs.unity3d.com/2022.3/Documentation/ScriptReference/MonoBehaviour.Invoke.html
Unity - Scripting API: MonoBehaviour.Invoke
If time is set to 0 and Invoke is called before the first frame update, the method is invoked at the next Update cycle before MonoBehaviour.Update. In this case, it's better to call the function directly. Note: Setting time to negative values is identical
docs.unity3d.com
https://docs.unity3d.com/2022.3/Documentation/ScriptReference/MonoBehaviour.InvokeRepeating.html
Unity - Scripting API: MonoBehaviour.InvokeRepeating
Declaration public void InvokeRepeating(string methodName, float time, float repeatRate);
docs.unity3d.com
3. 타이머를 사용하여 직접 구현하는 딜레이
Update 함수를 이용
매 프레임마다 시간을 더해 시간이 지남을 체크하는 방식으로 딜레이를 준다.
using UnityEngine;
public class DelayExample : MonoBehaviour
{
public float delayTime = 5f;
private float timer = 0f;
void Update()
{
timer += Time.deltaTime; // 프레임마다 시간을 더함
if (timer >= delayTime)
{
Debug.Log("5초 마다 실행됨");
timer = 0.0f;
}
}
}
4. WaitForSecondsRealTime(실제 시간 기준 대기)
1번 Corutine을 이용한 딜레이의 yield 키워드를 활용한 방법 부분에서 다뤘으므로 간단하게 예제만 다루고 넘어가도록 하겠다. 위쪽 글을 참고하면 된다.
// 실제 시간 기준으로 3초 대기
yield return new WaitForSecondsRealtime(3f);
https://docs.unity3d.com/2022.3/Documentation/ScriptReference/WaitForSecondsRealtime.html
Unity - Scripting API: WaitForSecondsRealtime
Success! Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable. Close
docs.unity3d.com
'Unity > 공부' 카테고리의 다른 글
[Unity] Firebase를 이용한 랭킹 시스템 (0) | 2025.02.13 |
---|---|
[Unity] Share, WebGL Build (1) | 2025.02.13 |
[Unity] 프로젝트 용량 줄이기 : 텍스처, 모델링 (2) | 2025.01.27 |
[Unity] 프로젝트 용량 줄이기 : 이미지 압축 (0) | 2025.01.22 |