Araina’s Blog

Time.deltaTime 이해하기 본문

Develop Study/Unity

Time.deltaTime 이해하기

Araina 2022. 8. 28. 13:23


 

 

1. Time.deltaTime

Unity 입문을 막 시작한 시절에 오랫동안 나를 괴롭혔던 기능 중 하나가 Time.deltaTime이다.

Time.deltaTime은 이전 프레임의 시작 시각, 현재 프레임이 시작되는 시각의 차(델타)를 의미한다.

즉, 이전 프레임에서 현재 프레임으로 넘어오는 데 걸린 시간 간격을 의미한다.

아래와 같은 코드가 있다고 가정하자.

private void Update() {
    transform.Translate(Vector3.forward * 10);
}

Update() 메서드 안에서 실행되고 있는 코드이므로, 1 프레임 단위로 10 유닛(10m)을 이동시킬 것이다.

게임이 만약 30 FPS로 실행되고 있다면 Update() 메서드는 1 프레임 단위로 실행되는 메서드이므로, 1초에 30번 호출된다.

그러므로 오브젝트는 총 300 유닛을 이동한다.

그러나 만약 게임이 60 FPS로 실행되고 있다면 어떻게 될까?

FPS 수치가 달라지므로, Update() 메서드가 호출되는 횟수도 달라지게 된다.

즉, Update() 메서드가 1초에 30번 실행되던 것이 1초에 60번 실행되는 것으로 바뀌는 것이다.

그렇게 되면 오브젝트는 총 600 유닛을 이동하여 30 FPS 일 때보다 2배 더 많은 거리를 이동할 것이다.

이런 경우에 Time.deltaTime을 곱해주면 된다.

private void Update() {
    transform.Translate(Vector3.forward * Time.deltaTime * 10);
}

30 FPS로 구동되는 기기의 Time.deltaTime의 값은 1/30초이다.

60 FPS로 구동되는 기기의 Time.deltaTime의 값은 1/60초이다.

이를 기반으로 수식을 세워보면 다음과 같다.

// 30FPS 기반
Time.deltaTime * 10 * FPS
1/30 * 10 * 30
== 10unit

// 60FPS 기반
Time.deltaTime * 10 * FPS
1/60 * 10 * 60
== 10unit

이제 프레임 수와 상관없이 똑같은 거리를 움직이는 오브젝트가 탄생했다.

이처럼 FPS 수치가 다른 환경에서도 개발자가 지정한 속도로 일정하게 움직여야 하는 경우에는 Time.deltaTime을 곱해주어야 한다.

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

Update() 메서드 안에서 이동이나 회전을 처리하는 로직을 작성했다면, 항상 Time.deltaTime을 곱해야 한다는 것을 잊지 말자.

 


 


수고하셨습니다!


Comments