MonoBehaviour는 모든 Unity 스크립트가 파생되는 기본 클래스이다. 이를 통해 스크립트를 GameObject에 컴포넌트로 붙이고, 다양한 실행 이벤트(콜백)를 활용할 수 있다.
Unity 엔진은 MonoBehaviour가 제공하는 콜백 함수(예: Start, Update, OnDestroy 등)를 호출한다. 이러한 흐름을 생명주기(Lifecycle)라 부른다.
생명주기 주요 함수
다음은 MonoBehaviour에서 자주 사용하는 생명주기 함수와 호출 시점이다
- Awake()
스크립트 인스턴스가 로드되는 즉시 호출된다. 초기화 용도로 주로 사용한다. - OnEnable()
컴포넌트가 활성화될 때 호출된다. Awake 이후, 활성화 시점마다 실행된다. - Start()
첫 업데이트 직전에 한 번만 호출된다. 추가 초기화 로직을 작성하는 데 적합하다. - FixedUpdate()
물리 연산을 일정한 시간 간격으로 처리할 때 사용한다. - Update()
매 프레임 호출되는 함수로, 게임 로직이나 입력 처리 등을 수행한다. - LateUpdate()
모든 Update() 호출이 끝난 후 호출된다. 카메라 추적 등 후처리 로직에 적합하다. - OnDisable()
컴포넌트나 오브젝트가 비활성화될 때 호출된다. 정리 로직에 주로 사용한다. - OnDestroy()
오브젝트가 파괴된 직후 호출된다. 리소스 해제 등 종료 작업에 활용된다. - OnCollision / OnTrigger
물리 충돌이나 트리거 이벤트 발생 시 호출된다. - OnApplicationQuit: 애플리케이션 종료 전 모든 게임 오브젝트에서 호출된다. 에디터에서 사용자가 플레이 모드를 중지할 때 호출된다.
코루틴 기능
MonoBehaviour 클래스는 **코루틴(Coroutine)**을 지원하며, 이를 통해 비동기 로직을 간편하게 작성할 수 있다.
StartCoroutine, StopCoroutine 등을 통해 대기 로직이나 비동기 처리를 프레임단위로 구현할 수 있다.
내부 구성 및 특징
- MonoBehaviour 인스턴스는 GameObject의 컴포넌트 형태로 존재해야 하며, AddComponent<T>()를 통해 동적으로 추가할 수 있다.
- 오브젝트가 파괴되면 MonoBehaviour도 함께 사라지지만, 내부 C# 객체는 GC 대상이 될 때까지 메모리에 남아 “null처럼 동작”할 수 있다. 이를 Fake null이라고 부른다.
- Inspector에서 컴포넌트를 비활성화하면, 해당 MonoBehaviour는 이벤트 콜백 호출이 중단된다.
주의점
- MonoBehaviour는 new 키워드로 생성할 수 없다.
PlayerController pc = new PlayerController(); // ❌ 오류
- 반드시 GameObject에 컴포넌트로 추가되어야만 존재할 수 있다.
GameObject player = new GameObject("Player");
player.AddComponent<PlayerController>(); // ✅ 올바른 방식