생명주기 [3]
Update(), FixedUpdate(), LateUpdate()
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 가 한참 더 먼 거리를 달렸을 것이다.
여기서 A 의 deltaTime 을 계산해본다.
1초 에 10 FPS, 1/10 초, 즉 deltaTime 은 0.1 초 라고 할 수 있다.
즉, 10 FPS 인 컴퓨터 환경에선 Time.deltaTime 는 0.1 초 를 반환한다.
100 FPS 인 컴퓨터에서는 0.01 초 를 반환한다.
캐릭터의 움직임을 speed 변수로 결정한다고 했을 땐, 아래와 같이 표현할 수 있다.
-
10 FPS인 컴퓨터 :speedxTime.deltaTime=speedx0.1 -
100 FPS인 컴퓨터 :speedxTime.deltaTime=speedx0.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 ()
개념
LateUpdate 는 Update 메서드가 호출된 이후에 실행된다.
LateUpdate 는 Scene 에 배치된 모든 게임 오브젝트의 Update 가 끝나야 호출된다.
Update 와 마찬가지로 매 프레임마다 호출되어, 프레임률에 의존적이다.
공식문서에도 적혀있듯이, 캐릭터가 움직이고 난 이후의 카메라 움직임 등
후처리 작업을 진행해야할 때 LateUpdate 에 구현해주면 좋다.
전체 비교
| 구분 | Update | LateUpdate | FixedUpdate |
|---|---|---|---|
| 호출 시점 | 매 프레임 |
Update 후 |
고정된 간격 |
| 프레임 의존성 | 있음 | 있음 | 없음 |
| 주 용도 | 일반 로직, 입력 처리 | 후처리 로직 | 물리 연산 |
| 시간 변수 | Time.deltaTime |
Time.deltaTime |
Time.fixedDeltaTime |
- 부드러운 조작감을 위해서 캐릭터 움직임은
Update - 캐릭터의 충돌은 안정적으로 일관되게 동작해야하니
FixedUpdate - 캐릭터가 움직인 이후에 카메라가 따라가야하니
LateUpdate
