Post

생명주기 [3]

Update(), FixedUpdate(), LateUpdate()

생명주기 [3]

Update()


개념

Update 함수는 매 프레임마다 자동으로 호출된다.

만약 60 FPS 라면 1 초60 프레임 을 출력한다. 즉 Update 함수도 60 번 호출된다.

Update 는 매 프레임마다 호출되기 때문에, 플레이어 입력에 대해 반응이 굉장히 빠르다.


하지만 프레임은 게임 중에도 수시로 변하기 때문에, 주기적으로 일정하게 호출되야하는

로직이 있다면 Update 에서 구현하지 않는 것이 좋다.


Time.deltaTime

Time.deltaTime 은 마지막 프레임이 완료된 후 경과한 시간을 반환한다.

쉽게 말하면 Time.deltaTime 은 어떤 컴퓨터든 프레임에 대해 동일한 환경을 만들어주는 변수다.


deltaTime

deltaTime 이란 시간의 변화를 의미한다.

게임 개발에서는 현재 프레임과 이전 프레임 사이의 시간간격을 의미한다.

예시 설명

  • A : 1 초 동안 10m 를 달림 → 10m/s
  • B : 0.1 초 동안 10m 를 달림 → 100m/s

10초 가 지났을 땐 B 가 한참 더 먼 거리를 달렸을 것이다.

여기서 AdeltaTime 을 계산해본다.

img

1초10 FPS, 1/10 초, 즉 deltaTime0.1 초 라고 할 수 있다.

즉, 10 FPS 인 컴퓨터 환경에선 Time.deltaTime0.1 초 를 반환한다.

100 FPS 인 컴퓨터에서는 0.01 초 를 반환한다.


캐릭터의 움직임을 speed 변수로 결정한다고 했을 땐, 아래와 같이 표현할 수 있다.

  • 10 FPS 인 컴퓨터 : speed x Time.deltaTime = speed x 0.1
  • 100 FPS 인 컴퓨터 : speed x Time.deltaTime = speed x 0.01

이렇게 함으로써 두 컴퓨터는 프레임에 관계없이 똑같은 거리를 이동할 수 있게 된다.


FixedUpdate ()


개념

Update 함수가 매 프레임 마다 호출되었다면, FixedUpdate 는 일정한 시간 을 두고 호출된다.

FixedUpdate 는 기본값으로 0.02초 (50FPS) 주기로 호출된다.

기본값인 0.02초Time.fixedDeltaTime 변수로 값을 조절할 수 있다.

FixedUpdate 내부에서 Time.deltaTime 을 호출하면 Time.fixedDeltaTime 을 반환한다.


Update 함수는 게임이 진행되는 동안 프레임이 고정되지있지 않다면 호출주기가 달라지게 되니,

예로들면 프레임 드랍을 이용한 벽을 뚫는 행위 등, 물리 연산을 할 때 이상한 결과를 만들어낼 수 있다.

그래서 안정적이고 일관된 물리 연산을 위해서는 FixedUpdate 를 사용하는 것이 좋다.


UI 혹은 캐릭터 움직임은 Update? FixedUpdate?

정해진 답은 없으나, FixedUpdate 에서 사용자 입력을 처리한다면 0.02 초 마다 처리하기 때문에

입력이 지연될 수 있어서 플레이어가 답답함을 느낄 수 있다.

즉각적인 피드백이 필요한 기능들은 Update 에 구현하는 것이 좋다.


구분 FixedUpdate Update
장점 - 물리 연산에 적합
- 일관성보장
- 더 부드러운 움직임
- 빠른반응
단점 - 부드럽지 않을 수 있음
- 입력지연
- 물리엔진 연산에 적합하지 않음
적합한 경우 - 물리 기반 이동
- 안전성이 중요
- Transform 기반 이동
- 부드러움이 중요


LateUpdate ()


개념

LateUpdateUpdate 메서드가 호출된 이후에 실행된다.

LateUpdateScene 에 배치된 모든 게임 오브젝트의 Update 가 끝나야 호출된다.

Update 와 마찬가지로 매 프레임마다 호출되어, 프레임률에 의존적이다.


공식문서에도 적혀있듯이, 캐릭터가 움직이고 난 이후의 카메라 움직임 등

후처리 작업을 진행해야할 때 LateUpdate 에 구현해주면 좋다.


전체 비교


구분 Update LateUpdate FixedUpdate
호출 시점 매 프레임 Update 고정된 간격
프레임 의존성 있음 있음 없음
주 용도 일반 로직, 입력 처리 후처리 로직 물리 연산
시간 변수 Time.deltaTime Time.deltaTime Time.fixedDeltaTime


  • 부드러운 조작감을 위해서 캐릭터 움직임은 Update
  • 캐릭터의 충돌은 안정적으로 일관되게 동작해야하니 FixedUpdate
  • 캐릭터가 움직인 이후에 카메라가 따라가야하니 LateUpdate


Reference