프로그래밍/Unity C#
[Unity] Tutorial 05 - Beginner Gameplay Scripting (DeltaTime)
김잉장
2019. 10. 30. 13:52
목표
- DeltaTime의 의미와 사용 방법에 대하여 알아보자.
DeltaTime의 의미
- 수학에서 델타(Delta)는 '변화'를 의미한다.
- Δ로 표기된다.
- Delta는 객체가 이동할 때, 객체의 위치 x를 Δx로 표현할 수 있다.
Time.deltaTime
- unity에서 Time.deltaTime은 1 프레임(Frame)의 실행 시간을 float으로 표현한다.
- Frame은 화면을 의미한다.
- fps는 frame per second의 약자로, 1초당 갱신된 화면의 수를 말한다.
- 만약 30fps라면 1초에 화면이 30회 갱신된 것이다.
- 여담으로 사람은 일반적으로 30fps이상의 갱신을 감지하지 힘들다.
- 60fps의 환경에서 Time.deltaTime은 1/60으로 0.01666의 값을 가진다.
- 30fps의 환경에서 Time.deltaTime은 1/30으로 0.03333의 값을 가진다.
- 이러한 특성을 사용하여, 사용자의 프레임 률(Frame Rate)에 독립적인 움직임을 표현할 때 사용된다.
Update에서 Time.deltaTime
-
Update는 매 프레임마다 호출되는 함수이다.
-
따라서 디비이스의 성능에 따라, 출력할 수 있는 프레임이 달라질 수 있다.
-
성능이 좋은 A(60fps) 디바이스와, 성능이 좋지 않은 B(20fps) 디바이스에서 Update마다 x+=2을 실행했다고 가정해보자.
-
5초가 지난뒤 A 디바이스에는 x가 600(60*5*2)이 되어있을 것이고, B 디바이스에서는 200(20*5*2)가 되어있을 것이다.
-
멀티 플레이 게임에서 위와 같은 현상이 일어나다면, 디바이스 성능에 따라 게임의 승패가 달라질 것이다.
-
위와 같은 문제를 해결하기 위하여 디바이스 성능에 관계없이, 동일시간에 동일 변화량을 구하려면 Time.deltaTime을 사용해야 한다.
-
아래와 같은 Time.deltaTime을 사용하여 변화량을 구한다면, 디바이스 성능에 독립적으로 시간에 따른 변화량을 구할 수 있을 것이다.
int x = 0;
void Update
{
x += 2 \* Time.deltaTime;
}
Time.deltaTime의 대안
- Unity에는 3가지 Update가 있다.
- Update : 스크립트가 활성화 되면 매 프레임 호출되는 함수이다. (이벤트나, 입력 처리에 사용하는 것이 좋다.)
- FixedUpdate : Fixed Timestep에 따라 일정한 간격을 가지고 호출되는 함수이다. (물리 현상을 처리할 때 사용된다.)
- LastUpdate : 모든 Update 함수가 호출된 이후 호출되는 함수이다. (카메라 움직임 등을 처리할 때 사용한다.)
- Fixed Timestep는 Edit > Project Settings에서 설정할 수 있다.
- Update에서 Time.deltaTime을 사용하여 매번 변화량을 연산하기 힘들다면, 호출되는 시간이 일정한 FixedUpdate을 사용하는 것도 좋은 방법이다.