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 을 쓰면 디바이스 성능에 따른 차이를 없애준다.
'Unity' 카테고리의 다른 글
[Unity] RhythmGame NotesEditor 노트 편집기 찾음 (0) | 2023.03.24 |
---|---|
[Unity] Mac 환경에서 VS 안에 한글 깨짐 수정하기 (0) | 2023.03.15 |
[Unity] Make Dynamic 2D Water (0) | 2023.02.01 |
[Unity] How to Program in Unity: Observer Pattern (0) | 2023.01.27 |
[Unity] bundleVersion, BundleVersionCode 가져오기 (0) | 2023.01.27 |