Time.time

Time.time은 프로젝트 재생이 시작된 이후의 시간을 반환한다.

 

 

Time.deltaTime

delta는 값의 차이를 뜻하는데, 현재 프레임의 시작시간과 이전 프레임의 시작시간과의 차이이다. 이는 지난 프레임이 완료되는 데까지 걸린 시간 차이를 의미하는 것과 동일한 의미이다. 즉, 한 프레임을 진행하는데 걸린 시간을 뜻한다.

 

※ FixedUpdate에서 Time.deltaTime이 호출되면, Time.fixedDeltaTime을 반환하게 된다.

 

 

30 프레임, 60 프레임에서의 deltaTime

보통 30프레임 기준에서는 Time.deltaTIme이 0.033초 정도가 나오고, 60프레임 기준의 게임에서는 0.016초정도가 나온다.

 

 

이동관련 코드에서 deltaTime을 사용하지 않을 경우 생기는 문제

다음과 같이 코드를 짜면 문제가 된다. 프레임이 10 이라면 캐릭터는 1초에 캐릭터를 10번 움직이게 되고, 프레임이 60일 때는 1초에 캐릭터를 60번 움직이게 된다. 즉, 컴퓨터의 성능이 오브젝트 이동 속도에 영향을 미치게 되므로 각자 유저의 컴퓨터마다 게임의 성능이 달라지게 된다.

 

이 문제를 해결하기 위해서 이동값에 delta time을 곱해준다. 이 방법을 통해 게임이 몇 프레임으로 진행되고 있는지에 전혀 상관없이 오브젝트는 동일한 속도로 움직일 수 있게 된다.

 

이동이나 회전 등 움직임에 있어서 시간의 영향을 받는 기능을 만들 때는 값의 deltaTime을 곱해야 프로세서 속도의 영향에서 자유로워 질 수 있다.

    public class TimeTest : MonoBehaviour
    {
        private float distancePerSecond;

        private void Start()
        {
            distancePerSecond = 1f;
            Application.targetFrameRate = 30;
            // Application.targetFrameRate = 60;
        }

        private void Update()
        {
            // 프레임에 따라 캐릭터가 움직이는 속도가 달라진다.
            if (Input.GetKey(KeyCode.W))
            {
                transform.position = transform.position + Vector3.forward * Time.deltaTime;
                // transform.Translate(0, 0, distancePerSecond * Time.deltaTime);
            }
        }
    }

이동은 이제 distancePerFrame이 아닌 distancePerSecond로 지정된다. 프레임 속도가 변경되면 그에 따라 이동 단계의 크기가 변경되므로 개체의 속도는 일정합니다.

 

정리하자면 deltaTime을 곱해주는 이유는 어느 컴퓨터 환경이든 동작한 결과가 똑같이 나와야 하기 때문이다.

 

 

deltaTime을 곱했을 때 왜 프로세스 성능영향을 받지 않을까?

프레임이 30이라 가정

프레임이 30이라는 것은 1프레임 당 30번의 Update() 메소드가 실행된 것이므로 대략 0.033초 ($1 \div 30 $) 간격으로 Update()메소드가 실행된다고 볼 수 있다.

 

단위벡터(길이가 1인 벡터)에 Time.deltaTime을 곱했을 때는 0.033초당 0.033씩 이동할 것이다. 이는 $ 거리 = 속력 \times 시간 $ 으로 계산 가능한데, 거리는 단위벡터인 Vector.forward로 생각하고 시간은 Time.deltaTime을 이용한다. 어차피 여기선 단위벡터이므로 0.033초가 지났을 때는 거리가 0.033으로 똑같이 이동했을 것이다. 유니티 좌표계에서 1은 현실에서 1m정도를 뜻하는 것으로 알고 있는데, 그렇다면 0.033초마다 0.033m씩 이동한다고 보면된다.

 

그리고 위 손글씨 그림에는 2초간 1.8을 이동한다고 적어놓았지만, 0.03과 0.033에서 생긴 오차이다. 오차를 제외하고 0.033333으로 계산한다면 2초간 근사하게 2m를 이동했을 것이다.

 

 

1초간 거리 10만큼 움직이도록 코드 개선하기

    float _speed = 10.0f;
    void Update()
    {
        if (Input.GetKey(KeyCode.W))
            transform.position += (new Vector3(0.0f, 0.0f, 1.0f)  * _speed) * Time.deltaTime;
    }

 

$ 거리 = 속력 \times 시간 $ 이라고 했다. 그러면 단위벡터에 속도 10을 곱해주어 속력을 계산한 뒤 시간을 곱해주면, 1초당 거리 10씩 이동할 수 있을 것이다.

 

 

 

참고자료

 

베르 유튜브

https://www.youtube.com/watch?v=6bFS4NN4DQs 

https://www.youtube.com/watch?v=1eu5GtN_ldM 

 

유니티 docs

https://docs.unity3d.com/ScriptReference/Time.html

 

https://ansohxxn.github.io/unitydocs/time/

https://euncero.tistory.com/530