TOOLS GAMES DEVLOG DOCS ABOUT CONTACT
HOME > DOCS > Unity / C# > MonoBehaviour 생명주기(Awake · Start · Update · FixedUpdate · LateUpdate) 핵심 정리
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. 흔한 실수와 방지 코드 패턴

LifecycleBestPractice.cs
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 컨텍스트 스위칭 오버헤드를 유발하므로 쓰지 않는다면 즉시 삭제해야 합니다.