이제까지 정리한 내용을 수학 레벨 + 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의 최종 결정권은 하나의 시스템에만 위임해야 한다.
'Unity > 초보자가 알면 좋을 팁' 카테고리의 다른 글
| Unity에서 캐릭터 이동 방식 종류에 대하여 (0) | 2026.03.03 |
|---|---|
| LateUpdate에 캐릭터 이동을 넣지 않는 이유에 대하여 (0) | 2026.03.03 |
| 유니티 Update / LateUpdate / FixedUpdate 사용 원칙 (꿀팁) - 4 (0) | 2026.03.03 |
| 유니티 Update / LateUpdate / FixedUpdate 사용 원칙 (꿀팁) - 3 (0) | 2026.03.03 |
| 유니티 Update / LateUpdate / FixedUpdate 사용 원칙 (꿀팁) - 2 (0) | 2026.03.03 |