Unity/초보자가 알면 좋을 팁

Unity 기본 아키텍쳐 흐름은 이해해보자 - Rigidbody, Update, LateUpdate, FixedUpdate

추운날_너를_기다리며 2026. 3. 3. 17:54

이제까지 정리한 내용을 수학 레벨 + Unity 실행 구조 + 실무 아키텍처 기준까지 모두 포함해서 작성했습니다.


Unity 기본 아키텍처 흐름은 이해해보자

- Rigidbody, Update, LateUpdate, FixedUpdate

Unity를 사용하다 보면 이런 질문이 반드시 나온다.

  • Update에서 이동하면 안 되나요?
  • Rigidbody가 있으면 왜 transform을 건드리면 안 되나요?
  • FixedUpdate는 정확히 언제 써야 하나요?
  • LateUpdate는 카메라 전용인가요?

이 글에서는 단순 사용법이 아니라,
Unity 실행 구조 + Transform 행렬 개념 + 시스템 소유권 관점에서
정확하게 정리해보겠다.


1️⃣ Unity 실행 흐름 이해하기

Unity의 기본 실행 순서는 다음과 같다.

 
(0~N회) FixedUpdate  → 물리 계산 (PhysX)
(1회)   Update       → 입력 & 게임 로직
(1회)   LateUpdate   → 후처리
         렌더링
 

핵심 차이:

구분 기준 시간
Update 프레임 기반 (가변)
FixedUpdate 고정 시간 기반 (기본 0.02초)
LateUpdate Update 이후 실행

즉, Update는 화면 프레임에 맞춰 실행되고,
FixedUpdate는 물리 시간에 맞춰 실행된다.

이 차이가 아키텍처의 핵심이다.


2️⃣ 먼저 알아야 할 핵심 개념: Transform은 결국 4×4 행렬이다

Unity의 모든 오브젝트는 내부적으로 4×4 Transform 행렬로 표현된다.

행렬 구조는 다음과 같다:

 
| right.x   up.x   forward.x   pos.x |
| right.y   up.y   forward.y   pos.y |
| right.z   up.z   forward.z   pos.z |
|   0         0        0         1   |
 
  • 1열 → right (로컬 X축)
  • 2열 → up (로컬 Y축)
  • 3열 → forward (로컬 Z축)
  • 4열 → position (월드 위치)

즉,

  • transform.right / up / forward 는 행렬의 앞 3열
  • transform.position 은 마지막 열 (pos.x, pos.y, pos.z, 1)

이다.

Rigidbody든 CharacterController든
결국 이 행렬을 계산해서 써주는 시스템일 뿐이다.


3️⃣ 가장 중요한 설계 원칙

수학적으로는 모든 것이 Transform 행렬 변경이다.

하지만 아키텍처 레벨에서는 다음이 중요하다:

한 오브젝트의 Transform은
하나의 시스템만 최종 결정권을 가져야 한다.

왜냐하면:

  • Update에서 위치 변경
  • FixedUpdate에서 Rigidbody가 위치 변경

이런 식으로 두 시스템이 동시에 수정하면
마지막에 적용된 값이 덮어써버린다.

이게 충돌, 떨림, 관통의 원인이다.


4️⃣ Rigidbody를 사용할 때의 사용 원칙

✔ 이동 소유권: PhysX

✔ 시간 기준: FixedUpdate

🔹 Update에서 하는 일

  • 입력 수집
  • 이동 의도값 저장
  • 상태머신 처리
  • 애니메이션 파라미터 설정
 
void Update()
{
    inputDir = new Vector2(
        Input.GetAxis("Horizontal"),
        Input.GetAxis("Vertical")
    );
}
 

여기서는 절대 transform.position을 수정하지 않는다.


🔹 FixedUpdate에서 하는 일

  • Rigidbody 이동
  • velocity 설정
  • AddForce
  • 점프
  • 넉백
 
void FixedUpdate()
{
    Vector3 move = new Vector3(inputDir.x, 0, inputDir.y);
    rb.MovePosition(rb.position + move * speed * Time.fixedDeltaTime);
}
 

여기서 PhysX가 최종 Transform을 결정한다.


🔹 LateUpdate에서 하는 일

  • 카메라 추적
  • UI 위치 보정
  • 시각적 후처리
void LateUpdate()
{
    camera.position = player.position + offset;
}

🚫 Rigidbody가 있을 때 금지 사항

 
transform.position += ...

Rigidbody가 붙어있다면
Transform 직접 수정은 구조적으로 충돌 가능성이 있다.


5️⃣ Rigidbody를 사용하지 않을 때

✔ 이동 소유권: 게임 로직

✔ 시간 기준: Update

대표 예:

  • CharacterController 기반 캐릭터
  • RPG / MMORPG
  • 물리 영향이 거의 없는 오브젝트

🔹 Update에서 하는 일

  • 입력 처리
  • 이동 계산
  • transform 이동
  • CharacterController.Move()
 
void Update()
{
    Vector3 move = inputDir * speed * Time.deltaTime;
    controller.Move(move);
}
 

또는

 
transform.position += move;
 

이 경우 FixedUpdate는 거의 사용하지 않는다.


6️⃣ Rigidbody 사용 여부에 따른 정리 표

📌 이동 소유권 기준

구분 Rigidbody 사용 Rigidbody 미사용
이동 소유권 PhysX 게임 로직
이동 실행 위치 FixedUpdate Update
입력 처리 Update Update
transform 직접 이동 ❌ 금지 ✅ 가능
물리 충돌 반응 자동 Controller 내부 처리

 

📌 함수별 사용 원칙

함수 Rigidbody 사용 Rigidbody 미사용
Update 입력 / 로직 입력 / 이동 / 로직
FixedUpdate 물리 이동 거의 사용 안 함
LateUpdate 카메라 / 표현 카메라 / 표현

7️⃣ MMORPG 기준 예시

MMORPG는 대부분:

  • CharacterController 기반
  • 서버 authoritative
  • 물리 최소화

구조 예시

Update

  • 입력 수집
  • 이동 계산
  • controller.Move()
  • 스킬 입력 처리
  • 패킷 생성

FixedUpdate

  • 사용 안 함 (물리 없음)

LateUpdate

  • 카메라
  • HP바
  • 이름표

8️⃣ 왜 입력은 항상 Update인가?

FixedUpdate는:

  • 0번 실행될 수도 있고
  • 2번 실행될 수도 있다.

입력을 FixedUpdate에서 받으면
입력이 누락될 수 있다.

그래서:

입력은 항상 Update에서 받는다.


9️⃣ 최종 정리

🎯 Rigidbody 있을 때

  • Update → 의도 계산
  • FixedUpdate → PhysX가 Transform 결정
  • LateUpdate → 표현

🎯 Rigidbody 없을 때

  • Update → 의도 + 실행
  • LateUpdate → 표현

🔥 핵심 한 줄 정리

Rigidbody는 물리 시간 축(FixedUpdate)을 따른다.
Rigidbody가 없다면 프레임 시간(Update)을 따른다.
그리고 Transform의 최종 결정권은 하나의 시스템에만 위임해야 한다.