슬로우도파민

유니티에서 시간 측정하기 1 - 엔진 내부 시계 사용 본문

개발기록/Unity 유니티

유니티에서 시간 측정하기 1 - 엔진 내부 시계 사용

슬로우도파민 2026. 8. 1. 14:28

1. Update()와 Time.deltaTime

매 프레임마다 이전 프레임부터 현재 프레임까지 걸린 시간(Time.deltaTime)을 누적하거나 빼서 타이머를 만듭니다.

화면에 남은 시간을 실시간으로 보여주는 UI(카운트다운)를 만들 때 가장 많이 사용됩니다.

 

using UnityEngine;

public class UpdateTimer : MonoBehaviour
{
	public float timeLeft = 10.0f;  // 10초 카운트 다운
    
    void Update()
    {
    	if (timeLeft > 0)
        {
        	timeLeft -= Time.deltaTime;  // 매 프레임마다 시간을 뺌
            // 예: timerText.text = Mathf.Round(timeLeft).ToString();
        }
        else
        {
        	Debug.Log("타이머 종료!");
            timeLeft -= 0;  // 음수로 내려가지 않게 고정
        }
    }
}

 

 

팁: 게임이 일시 정지(Time.timeScale = 0;)되었을 때 타이머도 멈추게 하려면
Time.deltaTime 을 쓰고, 일시 정지와 무관하게 실제 시간을 계속 측정해야 한다면
Time.unscaledDeltaTime 을 사용하세요.

 

 

 

2. 코루틴 (Coroutine)

특정 시간동안 대기했다가 다음 코드를 실행해야할 때 매우 유용합니다. 복잡한 상태를 관리하지 않고도 직관적인 코드 작성이 가능하여 스킬 쿨타임, 몬스터 스폰 주기, 일정 시간 후 오브젝트 파괴 등에 자주 쓰입니다.

 

 

using System.Collections;
using UnityEngine;

public class CoroutineTimer : MonoBehaviour
{
	void Start()
    {
    	StartCoroutine(TimerRoutine());
    }
    
    IEnumerator TimerRoutine()
    {
    	Debug.Log("타이머 시작!");
        
        // 정확히 5초를 대기합니다.
        yield return new WaitForSeconds(5.0f);
        
        Debug.Log("5초 경과!");
    }
}

 

 

3. Time.time 을 이용한 타임스탬프 방식

시작 시점의 시간을 기록해두고, 현재 시간(Time.time)에서 시작 시간을 빼서 경과된 시간을 측정합니다.

매 프레임 연산을 할 필요가 없어 플레이어가 레벨을 클리어하는 데 걸린 전체 시간이나 레이싱 게임의 랩 타임을 측정할 때 효율적입니다.

 

using UnityEngine;

public class TimestampTimer : MonoBehaviour
{
	private float startTime;
    private bool isTiming = false;
    
    public void StartRace()
    {
    	startTime = Time.time;	// 시작 시간 기록
        isTiming = true;
    }
    
    public void EndRace()
    {
    	if (isTiming)
        {
        	float timeTaken = Time.time - startTime;
            Debug.Log($"클리어 타임 : {timeTaken}초");
            isTiming = false;
        }
    }
}

 

 

4. Invoke (가장 간단한 지연 실행)

특정 함수를 몇 초 뒤에 실행하라고 예약하는 기능입니다. 매개변수(파라미터)를 넘길 수 없다는 단점이 있지만 코드가 가장 짧습니다.

 

using UnityEngine;

public class InvokeExample : MonoBehaviour
{
    void Start()
    {
        // 3초 뒤에 "Explode" 함수를 실행
        Invoke("Explode", 3.0f);
    }

    void Explode()
    {
        Debug.Log("펑!");
    }
}