Unity

[Unity] Time.deltaTime 의 정의 및 사용 이유

성엽이 2023. 3. 9. 11:19

Time.deltaTime 을 매번 사용하지만, 그 이유에 대해서 정리하자면

 

API 설명에서는

 

'이전 프레임에서 현재 프레임까지 걸린 시간이다. 1 프레임에 걸린 시간'

 

라고 한다. 정리해보자.

void Update(){

}

 

위의 Update() 메소드는 반복적으로 loop 되는 함수.

 

당연히 디바이스의 성능에 따라서 반복문에 많이 들어가거나 적게 들어갈 것이다. 구체적인 단위로는 

 

FPS(Frame per second)로 1초에 그림을 몇번 그려서 영상처럼 보이게 만드는지로 나타낸다.

 

float speed = 10f;

void Update(){        
	// 입력값
        float h_Input = Input.GetAxis("Horizontal");
        float v_Input = Input.GetAxis("Vertical");

	// speed 를 곱해서 실제 이동에 필요한 값
        h_Input = h_Input * speed;
        v_Input = v_Input * speed;

        // Vector3 속도정의
        Vector3 newVelocity = new Vector3(h_Input, 0f, v_Input);

        // Rigidbody 에 속도할당
        playerRigidbody.velocity = newVelocity;
}

<그림1>

 

위의 예제에서 h_Input, v_Input 은 디바이스의 성능에 따라서 Update 문을 호출하면서

 

값을 계속 입력받는다. 그리고 playerRigidbody.velocity 에 속도를 할당해주면서 Rigidbody 를 가지고있는

 

오브젝트가 움직일 것이다. 

 

float speed = 10f;

void Update(){
	// 1초에 10번 호출
...
        h_Input = h_Input * speed;	// * 10번 호출 : -1~1 * 10f * 10번
        v_Input = v_Input * speed;	// * 10번 호출 : -1~1 * 10f * 10번
...
}

<그림2. 1초에 10번 호출하는 디바이스>

float speed = 10f;

void Update(){
	// 1초에 100번 호출
...
        h_Input = h_Input * speed;	// * 100번 호출 : -1~1 * 10f * 100번
        v_Input = v_Input * speed;	// * 100번 호출 : -1~1 * 10f * 100번
...
}

<그림3. 1초에 100번 호출하는 디바이스>

 

입력이 많으면 많이 그려지고, 많이 이동할 것이다.

 

그렇다면 각각의 디바이스들은 그려지는 횟수나 이동거리가 각각 달라질 것이다.

 

이때 Time.deltaTime 즉 '이전 프레임에서 현재 프레임까지 걸린 시간이다. 1 프레임에 걸린 시간

 

그림 1. 의 설명

1초에 10회 호출되는거라면 1회는 10ms, 이때의 걸린시간 deltaTime은 1초를 기준으로 단위를 바꾸면 1/10 sec 가 된다.

 

0.1초에 1프레임 => 0.1초에 1번 그림 그린다.

1초에 10프레임 => 1초에 10번 그림 그린다.

 

그림 2. 의 설명

1초에 100회 호출되는거라면 1회는 1ms, 이때의 걸린시간 deltaTime은 1초를 기준으로 단위를 바꾸면 1/100 sec 가 된다.

 

0.01초에 1프레임 => 0.01초에 1번 그림 그린다.

1초에 100프레임 => 1초에 100번 그림 그린다.

 

10ms = 1/10 sec
1ms = 1/100 sec

 

그렇다면  위의 <그림2>, <그림3> 각각에

float speed = 10f;

void Update(){
	// 1초에 10번 호출
...
        h_Input = h_Input * speed * Time.deltaTime;	// * 10번 호출 : -1~1 * 10f * 10번 * 1/10
        v_Input = v_Input * speed * Time.deltaTime;	// * 10번 호출 : -1~1 * 10f * 10번 * 1/10
...
}

<그림2-1 수정된 10프레임의 디바이스>

float speed = 10f;

void Update(){
	// 1초에 100번 호출
...
        h_Input = h_Input * speed * Time.deltaTime;	// * 10번 호출 : -1~1 * 10f * 100번 * 1/100
        v_Input = v_Input * speed * Time.deltaTime;	// * 10번 호출 : -1~1 * 10f * 100번 * 1/100
...
}

<그림2-1 수정된 100프레임의 디바이스>

 

에서 h_Input, v_Input 각각은 speed 값에 의한 입력값만 남는다.

 

f(x) = -1~1 * 10f * 100 * 1/100

 

그러므로 오브젝트의 움직임이 프레임의 차이로 1초에 그려지는 횟수가 달라지기 때문에 끊기게 보이지만

 

1초에 도달하는 위치는 같아진다.

 

 

결론

Time.deltaTime 을 쓰면 디바이스 성능에 따른 차이를 없애준다.