Unity - MonoBehaviour와 생명주기 함수(Awake, Start, Update...)
MonoBehaviour 는 무슨 클래스인가
MonoBehaviour는 Unity 프로젝트에서 작성하는 컴포넌트형 C# 스크립트가 주로 상속하는 기본 클래스이다. GameObject의 컴포넌트로 동작하는 스크립트는 보통 MonoBehaviour를 상속한다.
MonoBehaviour 내 핵심 생명주기 함수
MonoBehaviour 에는 핵심 생명주기 함수가 있다. MonoBehaviour를 부착한 오브젝트가 게임 내 생성될 때, 정해진 순서대로 생명주기 함수가 실행된다. Unity의 공식 문서에는 다양한 종류의 이벤트 함수와 순서가 정리되어 있지만 여기서는 대표적인 몇개만 추려서 설명하려 한다.
Awake
- 항상 Start 함수 전에 호출
- 프리팹이 인스턴스화 된 직후에 호출
- 게임 오브젝트가 시작하는 동안 inactive 상태인 경우 Awake 함수는 활성화될 때까지 호출되지 않음
- 스크립트 컴포넌트가 disabled여도, GameObject가 active라면 호출
OnEnable
- active 상태의 GameObject에 붙은 컴포넌트가 enabled 될 때 호출
- 이벤트 구독을 넣기 좋은 위치
Start
- 스크립트 인스턴스가 활성화된 경우에만 첫 번째 프레임 업데이트 전에 호출
Update
- 컴포넌트가 enabled 상태일 때 프레임당 한 번 호출
FixedUpdate
- Unity의 물리 업데이트 루프에서 고정 간격으로 호출
- 기본적으로 0.02초 간격으로 호출
- 렌더 프레임 상황에 따라 한 프레임 안에서 0번, 1번, 여러 번 호출 될 수 있음
- 주로 물리 연산에 사용
LateUpdate
- 컴포넌트가 enabled 상태일 때 Update 가 끝난 후 프레임당 한 번 호출
- 모든 Update 함수가 호출된 뒤 실행
- 주로 카메라 이동 로직에 사용
OnDisable
- 컴포넌트가 disabled 되거나, GameObject가 inactive 상태가 되거나, 파괴/씬 언로드/도메인 리로드 때 호출
- 이벤트 구독 해제, 코루틴/상태 정리에 주로 사용
OnDestroy
- GameObject 또는 컴포넌트가 파괴될 때 호출
- 이전에 active 였던 GameObject에 대해서만 호출
그래서 그 흐름을 살펴보자면
초기화
Awake -> OnEnable -> Start
반복 업데이트:
FixedUpdate -> Update -> LateUpdate
비활성화/종료:
OnDisable -> OnDestroy
가 된다.
단, 서로 다른 GameObject 사이에서 같은 이벤트 함수가 호출되는 순서는 보장되지 않는다. Player 오브젝트와 Enemy 오브젝트 사이에 누가 Awake가 먼저 실행될 지 같은 것은 보장할 수 없다.
