Unity / C#
Beginner
Unity 2021.3+ / Unity 6
MonoBehaviour 생명주기(Awake · Start · Update · FixedUpdate · LateUpdate) 핵심 정리
초기화 순서 꼬임(NullReferenceException) 방지 원칙, 물리 틱과 렌더 프레임 분리 이유, Time.deltaTime과 Time.fixedDeltaTime의 올바른 사용 가이드.
#Unity #C# #MonoBehaviour #Lifecycle #Execution Order #Update
핵심 개념유니티 초심자가 가장 많이 겪는
NullReferenceException의 90%는 Awake와 Start의 초기화 책임 분리 원칙을 지키지 않아서 발생합니다. 또한 물리 연산과 카메라 추적이 각각 FixedUpdate와 LateUpdate에 격리되어야 화면 찢김이나 미세 떨림(Jitter) 없는 부드러운 게임 플레이가 완성됩니다.1. 3단계 초기화 및 업데이트 루프 매트릭스
| 메서드 | 실행 주기 | 주요 목적 및 권장 작업 | 델타 타임 인자 |
|---|---|---|---|
| Awake() | 씬 로드 시 1회 (비활성 컴포넌트도 부모 활성이면 실행) | 컴포넌트 자체 참조 캐싱(GetComponent), 내부 상태 초기화 | - |
| OnEnable() | 오브젝트/컴포넌트 활성화될 때마다 | 이벤트 리스너 등록, 델리게이트 구독 | - |
| Start() | 첫 번째 프레임 업데이트 직전 1회 (컴포넌트 활성 상태 필수) | 타 오브젝트/매니저와의 상호작용(Find, Singleton 데이터 수신) | - |
| FixedUpdate() | 고정 주기 (기본 0.02초, 50Hz) | 물리 엔진 연산(Rigidbody, 힘 가하기, 충돌 감지) | Time.fixedDeltaTime |
| Update() | 매 렌더링 프레임마다 (가변 주기) | 유저 입력 감지(Input), 애니메이션 파라미터 제어, 비물리 연산 | Time.deltaTime |
| LateUpdate() | 모든 Update() 종료 후 실행 | 카메라 위치 추적, 애니메이션 본 트랜스폼 오버라이드 | Time.deltaTime |
| OnDisable() | 오브젝트 비활성화 또는 씬 전환 시 | 이벤트 구독 해제, 진행 중인 트윈/코루틴 정리 | - |
2. 흔한 실수와 방지 코드 패턴
using UnityEngine;
public class CameraFollower : MonoBehaviour
{
[SerializeField] private Transform target;
[SerializeField] private Vector3 offset = new Vector3(0f, 2f, -10f);
[SerializeField] private float smoothSpeed = 10f;
// [잘못된 예]: Update()에서 카메라를 추적하면 타겟(FixedUpdate에서 이동)과 프레임이 어긋나 덜덜 떨림!
// [올바른 예]: LateUpdate()에서 추적하여 모든 오브젝트의 이동이 끝난 최종 위치를 캡처
private void LateUpdate()
{
if (target == null) return;
Vector3 desiredPosition = target.position + offset;
transform.position = Vector3.Lerp(transform.position, desiredPosition, smoothSpeed * Time.deltaTime);
}
}
3. 프로젝트 스크립트 실행 순서(Execution Order) 커스텀
[DefaultExecutionOrder(-100)]: 싱글톤 매니저(GameManager,SoundManager등) 클래스 위에 해당 어트리뷰트를 붙이면 일반 스크립트보다 먼저Awake가 실행되어 참조 실패를 원천 차단합니다.- 빈 이벤트 함수 삭제: 스크립트 템플릿에 기본으로 포함된 빈
Update()나FixedUpdate()는 유니티 네이티브-C# 런타임 간의 무의미한 P/Invoke 컨텍스트 스위칭 오버헤드를 유발하므로 쓰지 않는다면 즉시 삭제해야 합니다.