FixedUpdate vs Update – 게임 물리 엔진을 제대로 이해하기

 

Unity로 게임을 만들다 보면 Update()FixedUpdate() 두 가지가 자주 등장한다.
둘 다 “반복적으로 실행되는 함수”인데, 차이를 제대로 이해하지 않으면 캐릭터 움직임이 이상하거나 물리가 깨지는 현상이 생길 수 있다.

오늘은 Update와 FixedUpdate의 차이 그리고 왜 물리 연산은 FixedUpdate에서 해야 하는지를 깊게 살펴보자.


1. Update()란 무엇인가?

  • 매 프레임마다 호출된다.

  • 즉, 게임이 60FPS라면 초당 60번 호출된다.

  • FPS가 변하면 실행 횟수도 변한다.

👉 대표적인 용도: 입력 처리(Input)

void Update() { if (Input.GetKey(KeyCode.RightArrow)) { transform.Translate(Vector3.right * 5f * Time.deltaTime); } }

→ 키보드 입력에 따라 캐릭터가 부드럽게 움직임.


2. FixedUpdate()란 무엇인가?

  • 고정된 시간 간격으로 호출된다. (기본 0.02초 → 1초에 50번)

  • FPS와 관계없이 일정하게 반복된다.

  • Unity의 **물리 엔진(Physics Engine)**은 이 FixedUpdate 주기에 맞춰 동작한다.

👉 대표적인 용도: 물리 연산(Physics)

void FixedUpdate() { Rigidbody rb = GetComponent<Rigidbody>(); rb.AddForce(Vector3.up * 10f); }

→ 중력, 충돌 같은 물리 계산은 반드시 FixedUpdate에서 다뤄야 안정적이다.


3. Update vs FixedUpdate 차이 정리

항목Update()FixedUpdate()
호출 주기매 프레임고정 간격 (기본 0.02s)
FPS 영향받음받지 않음
주 사용입력 처리, 애니메이션물리 연산, 충돌 처리

4. 실제 사례

  • ❌ 잘못된 경우: Update() 안에서 Rigidbody에 AddForce 적용
    → FPS에 따라 물리 계산량이 달라져, 빠른 PC에서는 더 멀리 날아가고, 느린 PC에서는 덜 날아감.

  • ✅ 올바른 경우: FixedUpdate() 안에서 AddForce 적용
    → 어떤 PC에서 실행해도 같은 결과.


5. 마무리

정리하면,

  • Update() → 프레임 기반 (입력/애니메이션)

  • FixedUpdate() → 물리 기반 (충돌/중력/속도)

게임 루프 안에서 이 두 함수가 각각의 역할을 하기 때문에,
올바른 위치에 코드를 넣어야 예측 가능한 게임 동작을 만들 수 있다.

👉 다음 글에서는 **좌표계(월드 vs 로컬 좌표)**를 다뤄서, 캐릭터와 카메라 이동이 꼬이는 문제를 해결해 보겠다.

댓글

이 블로그의 인기 게시물

🚀 멀티플레이어 게임 최적화와 성능 튜닝 – 부드러운 게임 플레이 구현

⚔️ 멀티플레이어 스킬/아이템 동기화 – 실시간 전투 구현

🎬 멀티플레이어 리플레이 시스템 구현 – 게임 플레이 녹화와 재생