[Unity] Monobehaviour 정리

Lumos Velog·2025년 7월 17일
0

Monobehaviour

Unity에서 Monobehaviour는 모든 스크립트 컴포넌트의 기본이 되는 클래스다.
사용자는 Monobehaviour를 상속하여 자신의 C# 스크립트를 작성하며, 이를 통해 Unity의 오브젝트에 다양한 동작을 부여할 수 있다.




주요 특징

컴포넌트 기반 구조
Unity의 모든 컴포넌트는 GameObject에 부착되어 동작한다. Monobehaviour를 상속한 스크립트 역시 하나의 컴포넌트로 취급되어 GameObject에 AddComponent 형태로 추가할 수 있다.


전용 함수
충돌이나 트리거 이벤트(예: OnCollisionEnter, OnTriggerEnter) 등의 메시지 함수나 전용 인터페이스등 유니티에 맞춰져 있는 전용 함수들을 사용 할 수 있다.


라이프사이클
Monobehaviour는 게임 오브젝트의 생명주기 동안 자동으로 호출되는 여러 메서드를 제공한다.

  • Awake
    오브젝트가 씬에 활성화되는 순간 한 번 호출된다. 오브젝트가 카메라에 보여지기 전에, 가장 빠른 초기화 시점에 실행된다. 다른 스크립트와의 Awake 와 실행 순서를 보장하지 않기 때문에 오브젝트 본인에게 달려있는 내부 컴포넌트 참조 혹은 다른 초기 초기화 들을 진행하기에 적합하다.

  • OnEnable
    오브젝트가 활성화될 때마다 실행되며, 비활성 → 활성화 과정이 반복될 때마다 호출한다. Awake, Start 가장 큰 차이는 활성화 될때마다 실행된다는 점으로 어떤 이벤트의 구독이나 코루틴, 타이머 등 자주 활성화 비활성화 되는 상황에 주로 사용된다. 활성화 되는 즉시 반응하기 위해 Start 보다 먼저 호출된다.

  • Start
    오브젝트가 씬에 활성화된 뒤, 첫 프레임이 시작되기 직전에 한 번 호출된다. Awake가 모두 끝난 후, 다음 프레임 Update 직전에 실행된다. 외부 스크립트간의 Awake 들이 서로 순서를 보장하지 않기 때문에 외부 참조를 진행하기에 적합하다. 외부 참조가 필요한 작업들을 처리를 주로 하게 된다.

  • FixedUpdate
    물리 연산을 일정한 시간 간격으로 처리한다. 일반적인 Update 와 달리 고정 프레임으로 반복되는데 물리 엔진(Physics) 의 연산 타이밍에 맞추게 된다. 기기간 다른 성능에 상관없이 일관된 물리 연산을 하기 위해 이렇게 되었는데 그런 만큼 Update 와 로직을 공유하지는 않는지 주의해야 한다.

  • Update
    매 프레임마다 호출되어, 주로 입력 처리나 오브젝트 상태 업데이트에 사용된다. 이 또한 다른 스크립트와의 순서를 보장하지 않기 때문에 참조에 대한 확인이 필요하고 매 프레임 호출되기 때문에 로직 상에서 성능적인 이슈가 발생한다면 업데이트에서 비싼 비용을 처리하는 경우가 대부분이므로 주의가 필요하다.

  • LateUpdate
    Update 이후에 호출되고 주요 사용점은 Awake 와 Start 의 사용용도와 마찬가지로 다른 순서에 상관없는 처리들을 Update 에서 하고 그 정보를 바탕으로 처리해야 할 때 사용된다. 주로 카메라 관련해서 많이 사용하게 되는데 상황에 따른 카메라 이벤트를 발생시키고 최종 결정을 하는 용도로 많이 쓰인다.
    그렇지만 여러 스크립트간의 주기에 대한 동기화가 힘드므로 정말 필수적인 용도가 아니라면 지양하는게 좋다.

  • OnDisable, OnDestroy
    각각 비활성화, 파괴될 때 호출됩니다. 이벤트의 구독해제나 기타 참조 해제등에 주로 사용됩니다.


사용 이유

Unity Editor와의 통합
Monobehaviour를 상속한 스크립트는 Inspector에서 쉽게 속성을 수정하거나, 에디터 상에서 컴포넌트처럼 관리할 수 있다.


직관적인 오브젝트 제어
GameObject와 연동되어 오브젝트의 상태나 동작을 쉽고 직관적으로 제어할 수 있다.


게임 로직 구현의 표준 구조
Unity에서 동적인 게임 로직을 작성할 때 기본적으로 Monobehaviour를 상속하는 것이 표준적인 방법이다.




주의 사항

new로 인스턴스화하지 않고 AddComponent혹은 Instantiate 해야하며 전용 매서드를 사용할때 매개변수에 대해 오타가 있는지 확인해야한다.
특히 라이프사이클에 대한 실수는 초보 개발자가 주로 하는 실수이기에 확실한 인지가 필요하고 프로젝트 세팅에서 직접 순서를 지정해주기 보단 코드상으로 순서가 크게 중요치 않은 구조를 짜는게 유지보유리하다.

0개의 댓글