Time.deltaTime
이전 포스트에서 transform.Translate에 Time.deltaTime을 곱한걸 보았을것이다.
Time.deltaTime에 대하여 자세히 알아보자.
Update가 frame마다 실행되는건 알고있을것이다.
deltaTime은 이번 프레임에서 실행된 Update의 시간과 이전 프레임에서 실행된 Update의 시간의 차이다.

만약 자신의 모니터가 60fps 주사율의 모니터라면 Update의 사이 실행 시간은 이론상 1/60초일것이다.
이론상인 이유는 유니티는 단순히 Update함수만을 실행시키는 것이 아닌, 그 사이시간에 게임에 필요한 모든 로직을 실행시키기 때문이다. (자세한건 Unity Life Cycle 항목에 있다)
float t;
void Update()
{
t += Time.deltaTime;
if(t > 3)
{
// Do something...
t = 0;
}
}
그럼 왜 Translate에 Time.deltaTime을 쓸까.
계속 말하듯이 Update함수는 프레임마다 한번 실행된다.
transform.Translate(Vector2.right)를 이용해서 60fps와 144fps모니터를 가진 플레이어를 오른쪽으로 이동시킨다고 가정해보자.

이때 Update는 프레임마다 실행되므로, 60fps유저는 대략 60만큼의 거리를 이동하고, 144fps유저는 약 144만큼의 거리를 이동할것이다.
이렇게 될경우 프레임에 따라서 게임의 플레이가 달라지며 이러한 결과를 프로그래머는 원하지 않을 확률이 높다.
Time.deltaTime은 이전 프레임과 현재 프레임의 차이 이므로 60fps유저의 경우 1/60정도가 나오고 144fps유저의 경우 1/144정도일것이다.
따라서 밑의 계산식이 나오는걸 확인할 수 있다. (dist/sec == 초당 움직이는 거리)
60fps dist/sec = 1(speed) x 60(update의 초당 실행수) x (1 / 60) = 1
144fps dist/sec = 1(speed) x 144(update의 초당 실행수) x (1 / 144) = 1
60fps유저와 144fps유저의 속도가 같아지는 걸 확인 할 수 있다.
정리하자면
Rigidbody를 사용할때는 안써도 된다. Unity Life Cycle 항목의 그림을 자세히 보면 Physics쪽 구역에는 따로 루프가 도는것을 볼 수 있다.
이는 유니티가 물리연산을 진행할때 프레임의 영향을 받지 않게 따로 루프를 만들어서 구현해둔것인데.
깊게 들어가면 글이 너무 길어지므로 따로 공부하기를 바란다.
특히 Time.deltaTime을 써야할때와, 쓰지 말아야 할 때의 구분이 잘 나와있지 않기 때문에, 자신의 구현하는 시스템의 로직을 이해하고 Time.deltaTime을 써야하는지 잘 살펴봐야한다.