본문 바로가기
Unity 게임 개발

Unity time.time과 time.deltaTime의 설명 및 차이점

by daisy0461 2021. 3. 25.

docs.unity3d.com/ScriptReference/Time-time.html

Unity - Scripting API: Time.time

Time.time is the amount of time in seconds that the application has been running for. It is read-only. The application receives the current Time.time at the beginning of each frame, with the value increasing per frame. A time call per frame receives the sa

docs.unity3d.com

2020.3버전 Time.time API입니다.
docs.unity3d.com/ScriptReference/Time-deltaTime.html

Unity - Scripting API: Time.deltaTime

Success! Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable. Close

docs.unity3d.com

2020.3버전 Time.deltaTime API입니다.

게임을 만들면서 time.time과 time.deltaTime을 다르게 적용했을 때 차이점이 생겨서 정확하게 어떠한 점이 다른지에 관해 알고 있으면 다양한 방식으로 활용을 할 수 있을 것 같아서 한번 정리하기로 했습니다.


일단 Time.time부터 설명을 드리겠습니다.
Time.time은 어플리케이션이 실행 된 시간(초)이며 읽기 전용입니다.
응용 프로그램은 각 프레임의 시작 부분에 현재 Time.time을 수신하며 값은 프레임 당 증가합니다.
중요한 점은 Time.time은 프레임 당 시간이 아니라 애플리케이션이 실행된 시간을 제공하기 위한 것입니다.

public class Example : MonoBehaviour
{
    public GameObject projectile;
    public float fireRate = 0.5f;
    private float nextFire = 0.0f;

    void Update()
    {
        if (Input.GetButton("Fire1") && Time.time > nextFire)
        {
            nextFire = Time.time + fireRate;
            Instantiate(projectile, transform.position, transform.rotation);
        }
    }
}

위 코드를 해석을 해본다면 Fire버튼을 누르고 Time.time(어플리케이션이 수행된 시간) > nextFire가 성립이 된다면
nextFire의 시간이 수정이 되고 projectile이 복사가 되어서 생기게 됩니다.


그렇다면 Time.deltaTime의 경우는 어떨까요?
Time.delatTime 속성은 현재 프레임과 이전 프레임 사이의 시간을 제공합니다.
이 값은 float형태로 반환합니다. 그리고 단위는 동일하게 초를 사용합니다.
저는 Time.deltaTime의 사용하지 않은 예시를 들어보자면
A의 컴퓨터는 빨라서 Update가 더 빨리 실행이 되고 B의 컴퓨터는 느려서 Update함수 호출이 더 적다고 가정을 해봅시다. 그리고 Update에 캐릭터 이동거리를 정의를 해놓았습니다. 이렇게 된다면 당연히 Update가 더 많이 호출 되는 곳이 이동거리가 더 많을 수 밖에 없습니다.

public class ExampleClass : MonoBehaviour {
    void Update() {
        float translation = Time.deltaTime * 10;
        transform.Translate(0, 0, translation);
    }
}

예시로 코드를 적어보면 이와 같게 되겠습니다. Time.deltaTime을 사용해서 1프레임 당 이동거리를 계산하여 실행을 합니다. 위와 같이 작성을 한다면 Update가 몇번이 수행이 되어도 같은 결과를 낼 수 있습니다.
추가적으로 설명을 하자면 30프레임과 60프레임 컴퓨터가 있다고 가정을 하겠습니다.
Time.deltaTime*10을 Update에 정의를 했습니다. 30프레임에는 Time.deltaTime에 1/30의 값이 전해지고 60프레임에는 1/60이 전달이 됩니다. 그렇기에 1초가 지났을 때 결국 Time.deltaTime에 전해진 값들을 모두 다 더하면 1이 됩니다.
그렇기에 컴퓨터가 다르다고 하더라도 이동거리는 동일하게 됩니다.

이해가 잘 안되시는 분들을 위해서 다시 한번만 더 성명을 하자면 Time.deltaTime이 현재 프레임과 이전 프레임 사이의 시간을 float형태로 준다고 하였습니다. 극단적으로 전 프레임과 현 프레임의 시간차가 1.0f초라면 float값은 1.0f가 전달이 되는 것입니다.

결과적으로 Time.time과 Time.deltaTime의 차이점은
Time.time은 어플리케이션이 실행된 후 지난 시간
Time.deltaTime은 이전 프레임과 현 프레임 간의 시간을 의미합니다.