유니티의
void Update()
함수는 유니티를 [Play] 했을때 항상 true인 무한 반복문이라 생각하자.
무한 반복문인void Update()
함수의 실행속도는 개개인의 컴퓨터 사양에 따라 다르다.
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)
}
void Update()
{
transform.Translate(Vector3.forward * Time.deltaTime * 10)
}
void Update()
{
transform.Translate(Vector3.forward * Time.deltaTime * 10);
}
Time.deltaTime을 곱하지 않았을 때는 프레임당 지정한 유닛만큼 이동하고,
Time.deltaTime을 곱하면 초당 지정한 유닛만큼 이동한다.
특히 Update 함수에 이동 및 회전을 처리하는 로직을 작성했다면 반드시
Time.deltaTime 속성을 사용해야 한다.
//프레임마다 10유닛씩 이동
transform.Translate(Vector3.forward * 10);
//매 초 10유닛씩 이동
transform.Translate(Vector3.forward * Time.deltaTime * 10);
참고 서적 : 절대강좌! 유니티 2021