[Unity]Time.deltaTime

Inhwan98·2023년 3월 26일
0

Unity끄적

목록 보기
5/8

유니티의 void Update() 함수는 유니티를 [Play] 했을때 항상 true인 무한 반복문이라 생각하자.
무한 반복문인 void Update() 함수의 실행속도는 개개인의 컴퓨터 사양에 따라 다르다.

⏱Time.deltaTime을 사용하지 않은 상황예시

30프레임 사양의 컴퓨터와 60프레임 사양의 컴퓨터 유저를 각각 A, B라고 하겠다.
온라인 FPS게임을 제작하여, 총알이 앞으로 1m 이동하는 듯한 물리적인 기능을 구현했을때,
A유저와 B유저가 각각 만났고 동시에 총알을 발사했다.
어떻게 됐을까?

상황결과

A유저가 먼저 총알에 맞았고, B유저는 A유저가 총알에 맞고나서 맞거나 운이 좋으면 피했을 수도 있다.

왜 그럴까?

이유

30프레임 사양의 컴퓨터는 void Update() 함수가 1초에 30번 반복이 된다.
60프레임 사양의 컴퓨터는 void Update() 함수가 1초에 60번 반복이 된다.
즉, A유저는 1초에 총알이 30m를 이동하고, B유저는 1초에 총알이 60m를 이동한다.
B유저의 총알이 A유저에게 더 빠른 속도로 도달한 것이다.

컴퓨터 사양때문에 게임에서 확실하게 불합리한 경우가 있다면 억울하지 않은가?

해결방안

이를 해결해 줄수 있는 함수가 Time.deltaTime 인것이다.

Time.deltaTime은 이전 프레임의 시작 시각부터 현재 프레임이 시작되는 시각의 차(델타)를 말한다. 쉽게 풀이하면 이전 프레임부터 현재 프레임까지 걸린 시간의 차다.

void Update()
{
	transform.Translate(Vector3.forward * 10)
}
  • 30프레임 사양의 컴퓨터라고 했을때, 위 Update()는 1초에 30번 반복이 되어 1초에 10만큼 30번 이동할 것이며, 300유닛의 거리를 이동할 것이다.

30 fps

void Update()
{
	transform.Translate(Vector3.forward * Time.deltaTime * 10)
}
  • 30프레임으로 구동되는 기기의 Time.deltaTime 값은 1/30초(약0.033초)이고, 10을 곱하면 1/3초가 된다. 초당 30프레임으로 가정했기 때문에 30을 마저 곱하면 결국 초당 10유닛을 이동한다.

60fps

void Update()
{
	transform.Translate(Vector3.forward * Time.deltaTime * 10);
}
  • 이제 이 코드를 60프레임으로 구됭되는 환경에서 실행한다고 가정하고 계산하면
    1/60 x 10 x 60 = 10유닛을 이동한다. 즉, 프레임 레이트가 서로 다른 기기에서도 개발자가 정한 일정한 속도로 이동 시킬 수 있다. (스칼라 값에 따른 이동)

🖨요약

Time.deltaTime을 곱하지 않았을 때는 프레임당 지정한 유닛만큼 이동하고,
Time.deltaTime을 곱하면 초당 지정한 유닛만큼 이동한다.

특히 Update 함수에 이동 및 회전을 처리하는 로직을 작성했다면 반드시
Time.deltaTime 속성을 사용해야 한다.

//프레임마다 10유닛씩 이동
transform.Translate(Vector3.forward * 10);
//매 초 10유닛씩 이동
transform.Translate(Vector3.forward * Time.deltaTime * 10);

참고 서적 : 절대강좌! 유니티 2021

profile
코딩마스터

0개의 댓글