유니티/개념 정리
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초가 아닌 약간의 오차가 있는 출력 결과를 확인할 수 있다.