컴퓨터마다 사양이 다르기 때문에 게임의 FPS가 달라지고, 매 프레임마다 실행되는 Update 함수가 실행되는 횟수도 달라진다.
Update 함수에서 플레이어의 transform.position을 변경하는 작업을 수행하게 되면, 컴퓨터마다 FPS가 다르기 때문에 플레이어가 움직이는 속도도 달라질 것이다.
Time.deltaTime
Time.deltaTime은 각 프레임을 렌더링하는데 걸리는 시간이다.
예를들어 FPS가 100이면 초당 100번 프레임이 바뀌는 것이고, 시간은 1/100으로 deltaTime은 0.01이 되겠다.
Time.deltaTime은 FPS에 관계없이 캐릭터의 이동 속도를 일정하게 만드는 데 사용할 수 있다.
using UnityEngine;
public class PlayerController : MonoBehaviour
{
public float _speed = 10.0f;
void Start()
{
}
void Update()
{
if (Input.GetKey(KeyCode.W)) transform.position += new Vector3(0f, 0f, 1.0f) * Time.deltaTime * _speed;
if (Input.GetKey(KeyCode.S)) transform.position += new Vector3(0f, 0f, -1.0f) * Time.deltaTime * _speed;
if (Input.GetKey(KeyCode.A)) transform.position += new Vector3(-1.0f, 0f, 0f) * Time.deltaTime * _speed;
if (Input.GetKey(KeyCode.D)) transform.position += new Vector3(1.0f, 0f, 0f) * Time.deltaTime * _speed;
}
}WASD 키를 사용해 캐릭터를 상하좌우로 이동하는 로직이다.
A 컴퓨터는 100 FPS, B 컴퓨터는 10 FPS 라고 가정하고, Update 함수에서 캐릭터의 position을 1.0f 이동하려고 한다.
1초동안 컴퓨터 A와 B의 이동 거리를 비교해보자.
- 컴퓨터 A:
1.0f * 100번 실행= 100m 이동 - 컴퓨터 B:
1.0ㄹ * 10번 실행= 10m 이동
컴퓨터가 좋을수록 이동속도가 빠른 말도 안되는 문제가 발생한다.
여기에 Time.deltaTime 을 곱해보자.
- 컴퓨터 A:
(1.0f * 0.01초) * 100번 실행= 1m 이동 - 컴퓨터 B:
(1.0f * 0.1초) * 10번 실행= 1m 이동
놀랍게도, FPS가 달라도 1초동안 같은 거리를 이동한다.
핵심
Time.deltaTime은 프레임을 렌더링하는 데 걸린 시간이라고 했다.
- FPS 100이면
deltaTime은 0.01이다. 둘이 곱하면 1이다. - FPS 10이면
deltaTime은 0.1이다. 마찬가지로 곱하면 1이다.
즉 deltaTime 은 프레임당 움직임을 시간당 (초당) 움직임으로 바꿔주는 도구 라고도 말할 수 있겠다.