프로그래밍/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을 사용하는 것도 좋은 방법이다.