본문 바로가기
유니티/개념 정리

StopWatch와 Time.deltaTime

by fore4022 2024. 9. 12.

StopWatch란?

  • .net에 포함된 클래스이다.
  • StopWatch의 인스턴스를 생성해서 Start, Stop, Elapsed 등을 이용해서 시간을 구할 수 있다.
  • 정확한 시, 분, 초를 구할 수 있다.

Time.deltaTime란?

  • 지난 프레임에서 현재 프레임까지 경과 시간이다.
  • 일정한 값을 지닌 상수가 아니기 때문에 Time.deltaTime의 값은 특정할 수 없다.
  • Time.timeScale에 영향을 받는다.

타이머를 만든다면?

StopWatch로 타이머를 만든다면

  • 게임의 흐름에 따라서 타이머가 시작하고, 멈추는 동작을 구현해 주어야 한다.
  • 정확한 시간을 구할 수 있다.
  • 별도의 구현이 필요하지 않다.

Time.deltaTime으로 타이머를 만든다면

  • 프레임에 따라 타이머가 느려지거나 빨라지고, 프레임 저하가 심할 경우에는 타이머가 기존과 다르게 동작할 수 있다.
  • Time.timeScale을 이용해서 게임의 흐름에 맞추어서 타이머가 시작하고 멈출 수 있다.
  • 초 단위가 아닌, 분과 시간 단위의 시간을 구하려면, 별도의 연산을 해주어야 한다.
  • 특정 시간 이후의 동작을 만들 수 있다.

using System.Collections;
using System.Diagnostics;
using UnityEngine;
using Debug = UnityEngine.Debug;
public class Test : MonoBehaviour
{
	[SerializeField]
    private int sec;
    
    private Stopwatch stopwatch = new();

    private void Start()
    {
        StartCoroutine(WaitForSec());
    }
    private IEnumerator WaitForSec()
    {
        stopwatch.Start();

        Debug.Log(stopwatch.Elapsed.Seconds);

        yield return new WaitForSeconds(sec);

        stopwatch.Stop();
        
        Debug.Log(stopwatch.Elapsed.Seconds);

        yield return new WaitForSeconds(sec);

        Debug.Log(stopwatch.Elapsed.Seconds);

        Debug.Log(stopwatch.ElapsedMilliseconds);
        Debug.Log(stopwatch.Elapsed.Minutes);
        Debug.Log(stopwatch.Elapsed.Hours);

        stopwatch.Restart();

        yield return new WaitForSeconds(sec);

        Debug.Log(stopwatch.Elapsed.Seconds);
       
        yield return new WaitForSeconds(sec);

        stopwatch.Reset();

        Debug.Log(stopwatch.Elapsed.Seconds);
    }
}// 실행 결과 : stopwatch를 시작한 직후 출력한 log는 '0'이 출력된다. sec 초 뒤에 log로 sec초가 출력된다.
//							stopwatch를 stop하였기에 sec초, ElapsedMilliseconds는 WaitForSeconds에서 약간의 딜레이까지 출력하여서, sec보다 크다.
//							stopwatch는 분과 시간 단위로 출력하였을 때는, 경과한 시간이 초단위기 때문에 0이 출력된다.
//							stopwatch를 restart하였기 때문에 기존에 지난 시간이 0이 되고, WaitForSeconds로 다시금 sec가 출력된다.
//							stopwatch를 reset하면 지난 시간이 0이 되어서, log가 0이 출력된다.
using System.Collections;
using UnityEngine;
using Debug = UnityEngine.Debug;
public class Test_Main : MonoBehaviour
{
    private void Start()
    {
        StartCoroutine(DeltaTime_Timer());
    }
    private IEnumerator DeltaTime_Timer()
    {
        float seconds = 0;

        while (true)
        {
            seconds += Time.deltaTime;

            Debug.Log(seconds);

            yield return null;
        }
    }
}// 실행 결과 : 출력된 log를 확인해보면, 한 프레임을 기준으로 하기 때문에, 정확히 1초가 아닌 약간의 오차가 있는 출력 결과를 확인할 수 있다.

'유니티 > 개념 정리' 카테고리의 다른 글

관찰자 패턴(Observer Pattern)  (0) 2024.09.26
상속  (0) 2024.09.23
This  (0) 2024.09.09
IInputActionCollection  (0) 2024.09.02
Task  (0) 2024.08.23