게임 개발/유니티 엔진

유니티 엔진의 생명주기와 MonoBehaviour

술단고 2024. 5. 26. 19:58

 

오늘은 유니티 엔진을 사용해 게임을 개발하는 사람들이라면,

꼭 한 번은 짚고 넘어가야할 유니티의 생명 주기(Life Cycle)에 대해 이야기를 해볼까 한다.

 


 

MonoBehaviour

유니티 엔진에서 C# 스크립트를 만들면, 기본적으로 MonoBehaviour가 상속되어있다.

 

 

유니티 공식 홈페이지에서 Unity Docs를 살펴보면, MonoBehaviour가 가장 중요한 클래스라고 서술되어있다.

 

중요 클래스 - MonoBehaviour - Unity 매뉴얼

MonoBehaviour 클래스는 기본적으로 모든 Unity 스크립트가 파생되는 기본 클래스입니다. Unity의 프로젝트 창에서 C# 스크립트를 생성하면 MonoBehaviour에서 자동으로 상속되며, 템플릿 스크립트를 제공

docs.unity3d.com

 

MonoBehaviour 클래스는 기본적으로 모든 Unity 스크립트가 파생되는 기본 클래스입니다.
Unity의 프로젝트 창에서 C# 스크립트를 생성하면 MonoBehaviour에서 자동으로 상속되며,
템플릿 스크립트를 제공합니다. 

 

 

 

MonoBehaviour를 상속받아야 우리가 늘 유니티에서 당연하게 쓰는 기능들인

Start, Update, OnCollisionEnter 등의 다양한 이벤트들을 사용할 수 있으며,

코루틴을 시작, 중지 및 관리할 수 있게 된다.

 

그럼 위의 다양한 이벤트들은 무엇이고, 어떤 방식으로 흘러가게 될까?

 


 

유니티의 생명주기

 

생명주기(Life Cycle)는 컴퓨터 구조에서 정말 빈번하게 많이 사용되는 어휘이고,

단어가 사용되는 장소에 따라 그 의미가 조금씩 달라진다.

 

우선, 유니티에서 말하는 생명주기는, 쉽게 말해 이벤트 함수의 실행 순서라고 생각하면 된다.

이 스크립트 라이프사이클의 개요는 Unity Docs에서도 살펴볼 수 있다.

 

이벤트 함수의 실행 순서 - Unity 매뉴얼

Unity 스크립트를 실행하면 사전에 지정한 순서대로 여러 개의 이벤트 함수가 실행됩니다. 이 페이지에서는 이러한 이벤트 함수를 소개하고 실행 시퀀스에 어떻게 포함되는지 설명합니다.

docs.unity3d.com

 

유니티의 라이프사이클 플로우차트

 

 

위 유니티 라이프사이클에서 사용되는 주요 이벤트 함수들을 같이 살펴볼건데,

모든 이벤트 함수를 전부 알아보는 것은 다음 시간에 하고, 우선 주요 이벤트 함수를 살펴보도록 하자.

 

Awake

Awake 함수는 Start 함수 전에 호출되며, 프리팹이 인스턴스화된 직후에 한 번만 호출된다.
유니티 생명주기의 가장 최우선에 배치되어있는 이벤트 함수라고 생각하면 좋다.

OnEnable

오브젝트가 활성화된 직후 이 함수가 호출된다.
레벨이 로드되고, 게임 오브젝트가 인스턴스화될 때 실행된다.

Start

스크립트 인스턴스에 들어가서, 첫 번째 프레임 업데이트 전에 호출되는 이벤트 함수이다.
Awake나 OnEnable보다 느리며, 스크립트를 기본 생성할 때 이미 생성되어있기도 하다.
특별한 경우가 아닌 이상 오브젝트가 게임을 시작할 때 1회 실행되는 코드들은 대부분 이 Start 이벤트 함수에 삽입한다.

FixedUpdate

Update와 혼용되기 쉬우나, FixedUpdate는 그 역할이 확실히 존재한다.
이 함수는 호출 간격이 일정하고, 매번 일정한 주기로 똑같은 연산을 처리해야 하는 물리 계산에 주로 사용된다.
즉, Rigidbody 컴포넌트를 활용하는 코드는 Update보단 FixedUpdate에서 실행되는 것이 조금 더 정확하다.

OnTrigerXXX

두 오브젝트의 충돌 체크를 하는 함수이다.
오브젝트에 On Trigger가 체크되어있는 Collider 컴포넌트를 필요로 하며,
물리 연산을 하지 않는다.

OnCollisionXXX

두 오브젝트의 충돌 체크를 하는 함수이다.
오브젝트가 Collider 컴포넌트를 필요로 하며,
물리 영향을 받으므로 Rigidbody 컴포넌트 역시 필요로 한다.

Update

매 프레임마다 호출되는 함수이다.
스크립트를 기본 생성할 때 이미 생성되어 있으며, 스크립트가 활성화되어 있어야 호출된다.
많은 게임 개발서에서 으레 말하듯, Update에 어느정도의 코드를 작성하는 것은 현대에 있어선 괜찮으나
너무 많은 오브젝트에서 Update문을 호출하거나, Update문 안에 반복문이 있는 것 만큼은 피해야 한다.

LateUpdate

Update 함수가 실행된 후에 실행되는 늦은 Update문이다.
보통 3인칭 카메라 이동 로직에 주로 활용된다.

OnApplicationQuit

애플리케이션 종료 전, 모든 게임 오브젝트에서 호출된다.
또한 유니티 에디터에서 사용자가 플레이 모드를 중지하면 호출된다.

OnDisable

오브젝트 또는 스크립트가 비활성화 되면 1회 호출된다.
이벤트 연결 종료 시 사용되며, 코루틴으로 실행할 수 없다.

OnDestroy

오브젝트 존재의 마지막 프레임에 대해 모든 업데이트를 마친 후 1회 호출된다.
즉 오브젝트가 파괴되고, 해당 오브젝트가 모든 로직을 수행하고 난 뒤 최후에 실행되는 이벤트 함수이다.

 

 


 

외에도 생명 주기에 OnPreCull, OnRenderObject와 같은 렌더링 함수나

yield, yield StartCoroutine과 같은 코루틴 함수들도 존재하지만

이 포스팅에서는 생명주기 자체에 집중을 하였기 때문에 별도로 서술하지 않았다.

 

그러나 코루틴은 유니티 스크립트에 있어서 매우매우 중요하며 정말 자주 사용되는 이벤트이므로,

반드시 다음 포스팅에서 자세하게 다뤄보도록 하겠다.