DevDino

[Unity 기술면접] Unity 생명주기(Lifecycle) 본문

Unity/기술면접

[Unity 기술면접] Unity 생명주기(Lifecycle)

데브다이노 2025. 12. 10. 14:25

확실히 구분해야 하는 2가지
★ Awake()와 Start()의 호출 순서, 용도 차이
★ Update()와 FixedUpdate()의 차이

Unity 생명주기(Lifecycle)

Unity에서 MonoBehaviour로 작성한 스크립트는 게임 실행 중에 여러 이벤트 함수(event function)가 미리 정해진 순서대로 호출됩니다. 순서를 이해하면 초기화, 업데이트, 물리 처리, 렌더링, 파괴 시점 등을 명확히 제어할 수 있습니다.

1. 첫 씬 로드 시점

  • Awake(): 게임 오브젝트가 인스턴스화 된 직후 호출됨. 활성화 상태가 아니면 호출되지 않음. 생명 주기 동안 단 한 번만 호출됨.
  • OnEnable(): 오브젝트 또는 스크립트가 활성화(SetActive(true))될 때 호출됨. AwakeStart와 달리 여러 번 호출될 수 있어, 재사용되는 객체의 상태를 초기화할 때 유용함.

2. 첫 프레임 업데이트 이전

  • Start(): 활성화된 스크립트에 대해 첫 Update 직전에 한 번 호출됨.

3. 프레임 루프(업데이트 순서)

  • FixedUpdate(): 물리 연산을 위한 일정한 시간 간격에 따라 호출됨. 프레임률(fps)과 상관없이 호출 시점이 보장됨.
  • Update(): 매 프레임 호출됨. 메인 게임 로직 처리에 사용됨.
  • LateUpdate(): Update가 끝난 뒤 호출됨. Update에서 캐릭터의 이동 연산이 완전히 끝난 후, 카메라가 그 최종 위치를 추적하게 만들어 화면 떨림을 방지할 때 주로 사용됨.

참고: 코루틴(Coroutine)의 yield return null은 보통 Update 로직이 끝난 후, LateUpdate가 호출되기 전 사이 시점에 실행됩니다.

4. 렌더링 단계

  • OnPreCull(), OnWillRenderObject(), OnPreRender(), OnRenderObject(), OnPostRender() 등: 카메라의 컬링, 렌더링 직전/직후 시전에 호출되는 함수들.
  • OnGUI(), OnDrawGizmos() 등: GUI 이벤트 처리나 씬 뷰 기즈모 그리기 등에 쓰임.

5. 기타

  • OnDestroy(): 오브젝트가 파괴되기 전 마지막 프레임에 호출됨.
  • OnApplicationQuit(): 애플리케이션 종료 직전에 호출됨.

Awake vs Start

Awake는 씬 로드/인스턴스화 직후 시점에 가장 먼저 호출됩니다. 여기서 자기 스스로를 초기화하고, ScriptableObject나 정적 데이터의 참조를 설정하는 것이 적합합니다.

Start는 모든 Awake & OnEnable이 다 끝나고, 첫 Update 직전에 호출됩니다. 즉 다른 객체들도 이미 준비된 상태입니다.

그래서 Awake내부 상태 초기화(private 변수 초기값 세팅, ScriptableObject 로드 등), Start다른 객체에 의존하는 것 초기화(GameManager 찾기, 다른 Component 참조 연결 등)를 하는 단계입니다.

Update vs FixedUpdate

이동 코드를 Update에서 썼다고 가정해보았을 때,

void Update()
{
    rigid.AddForce(Vector3.forward * speed);
}

Update는 프레임률에 따라 호출 간격이 변하므로 60fps 환경과 120fps 환경에서 결과가 달라집니다.
(만약 물리 엔진이 아닌 Transform을 이용해 Update에서 이동시킨다면, 프레임 보정을 위해 반드시 Time.deltaTime을 곱해줘야 합니다.)

void FixedUpdate()
{
    rigid.AddForce(Vector3.forward * speed);
}

다른 환경에서 같은 결과를 나타내기 위해 코드를 FixedUpdate로 옮겨야 합니다.

요약
★ Awake -> OnEnable -> Start 순으로 실행됨.
★ Update는 프레임마다 호출되고 FixedUpdate는 일정한 주기로 호출됨. 그래서 입력이나 일반 로직은 Update에서 처리하고, 물리 엔진과 관련된 위치/속도 보정은 FixedUpdate에서 처리함.

참고
Unity 공식 매뉴얼 - 이벤트 함수의 실행 순서