본문 바로가기
- Unity/let us all UNITE !

[Unity] Update FixedUpdate LateUpdate

by david_동근 2025. 5. 16.

https://docs.unity3d.com/6000.0/Documentation/Manual/execution-order.html

 

위 이미지는 Order of execution for event functions (이벤트 메서드 순서)의 플로우차트 일부분으로,

해당 내용은 다른 포스트에서 다루도록 하고, 이번 포스트에선 게임 로직의 중추가 되는 파트를 정리하였습니다.

 


 

Update, FixedUpdate, LateUpdate

Update, FixedUpdate, LateUpdate 는 MonoBehaviour 클래스의 이벤트 메서드로써,

상황이나, 목적에 따라 어떤 메서드를 사용할 것이냐 구분할 수 있습니다.

  호출 시점 설명
Update() every Frame 입력, 일반적인 로직 (transform) 이나 애니메이션 호출 등
FixedUpdate() fixed Time 물리 기반 (Rigidbody, Collider, Physics) 등
LateUpdate() called after Update 후처리, Camera 혹은 UI (갱신 시 필요) 등
오브젝트 간 연산의 순서 제어시 사용

 

위 처럼 간단히 정리할 수 있지만, 각 메서드 특징 별로 좀 더 정리해보았습니다.

 

 

Update()

모든 프레임마다 호출됨으로 연속적인 입력에 대해서 반응성이 보장이 됩니다.

'모든 프레임마다 호출됨'은 기기의 성능 (Frame Rate) 에 따라 구현이 달라질 수 있다는 말이기도 합니다.

입력처리, 이동 명령(transform.Translate / position) 등 로직의 대부분은 Update() 메서드에서 작성하게 되며,

애니메이션 호출 처리 또한 Update에서 합니다. 시간 보정은 Time.deltaTime을 곱해서 하게 됩니다.

 

Time.deltaTime

<직전의 프레임 ~ 지금 프레임> 사이 걸린 시간을 반환합니다.

Frame Rate에 따라 반환되는 시간이 달라지므로 Update() 메서드에서 사용해 보정합니다.

(만약 FPS가 너무 높아 프레임이 자주 호출되면, 플레이어 이동속도가 빨란진 것처럼 보이겠죠?)

void Update() {
    float move = speed * Time.deltaTime;  // 프레임기반으로 속도 보정
    transform.Translate(move, 0, 0);
}

 

FixedUpdate()

고정된 시간 간격으로 호출합니다. (매프레임 호출하는 Update와는 반대로)

디폴트는 0.02 sec 로 초당 약 50회 호출이 되며,

특히 Rigidbody나 Collider와 같은 물리 연산에 적합합니다.

그 이유는 일정한 시간 간격으로 호출돼 안정적인 결과가 보장되지만,

Update()에서 물리 연산을 처리할 경우 프레임에 따라 달라지는 기대치 않는 결과가 나올 수 있습니다.

 

외에도, 꼭 물리연산이 아니어도, 서버/네트워크 상태 체크나 주기적인 동기화에도 유리합니다.

 

Time.fixedDeltaTime

물리 기반 움직임을 수치화할 땐 fixedDeltaTime을 곱해주어야 합니다.

void FixedUpdate() {
    float move = speed * Time.fixedDeltaTime;  // 물리 시뮬용 시간 보정
    rb.MovePosition(transform.position + Vector3.right * move);
}

 

 

LateUpdate()

Update()가 호출 된 다음에 호출되는 메서드로, Update()에서 처리가 다 끝난 뒤 후처리로 적합합니다.

특히 카메라 추적과 같은 타겟 오브젝트의 위치가 변한 뒤 따라가는 경우나,

UI 위치를 3D 오브젝트 기준으로 따라 붙게 할 때 등 사용합니다.

 

카메라 오브젝트를 부드럽게 선형 보간으로 따라간다고 치면,

void LateUpdate() {
    cam.position = Vector3.Lerp(cam.position, target.position, camSpeed * Time.deltaTime);
}

 

카메라 흔들림 (피격 효과) 등 카메라의 후처리도 LateUpdate()에서 처리하기 적합합니다.

 

혹은 마지막 위치를 기억하는 (스냅샷) 기능 처럼 lastFramePosition = transform.position;

과 같이 Update() 처리 후에 호출되어야 하는 작업에 필요합니다.

 

(애니메이션의 후처리, Animator는 Update()에서 born 위치를 계산해요.

그렇기 때문에 born 위치에 의존한 작업은 LateUpdate()에서 처리해야 정확하다고 하네요)

 


 

오늘도 좋은 하루 보내시길 바랍니다. (๑ゝڡ◕๑)