[C# Unity] MonoBehaviour란?

Arthur·2023년 7월 19일
0
post-thumbnail

공부하게 된 계기


유니티를 배울 때 스크립트 작성 시 제일 먼저 마주했던게 MonoBehaviour였습니다.

처음에는 단순히 Main() 함수와 같이 entry point의 역할을 하는 줄 알았습니다.
하지만 MonoBehaviour를 통해 사용할 수 있는 다양한 이벤트 들이 있습니다.

유니티 Docs에서도 보면 MonoBehaviour는 중요 클래스라고 정의되 었습니다.
단순히 넘어가기에는 유니티 엔진 자체의 메커니즘을 이해하기 힘들 것 같다고 생각해서
이렇게 글로 작성하게 되었습니다.



MonoBehaviour


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

유니티 Docs에 정의되어 있는 MonoBehaviour에 대한 개념입니다.
유니티에서 스크립트 파일 생성 시 MonoBehaviour를 자동으로 상속합니다.

여기서 상속 받은 MonoBehaviour를 통해 이벤트 함수들을 override해서 사용할 수 있습니다.

C# 유니티 스크립트 예제 코드

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestScript : MonoBehaviour
{
	// Start is called before the first frame update
    void Start()
    {
        
    }

	// Update is called once per frame
    void Update()
    {
        
    }
}

유니티 Docs를 확인해보니 MonoBehaviour의 궁극적인 것은
유니티에서 게임 오브젝트에 스크립트와 연결을 제공하기 위한 것입니다.
이런 게임 오브젝트를 시작 단계 혹은 프레임 단위의 업데이트에서 이벤트를 발생시켜 컨트롤 합니다.



MonoBehaviour의 이벤트들


이벤트 명내용
Start게임 오브젝트가 존재하기 시작할 때 호출
Update프레임마다 호출
FixedUpdate물리 타임스텝마다 호출
OnBecameVisible, OnBecameInvisible게임 오브젝트 렌더러가 카메라의 뷰에 들어오거나 나갈 때 호출
OnCollisionEnter, OnTriggerEnter물리 충돌 또는 트리거가 발생할 때 호출
OnDestroy게임 오브젝트가 파괴될 때 호출

위 내용은 Unity Docs에 있는 내용을 표로 정리한 것입니다.
스크립트 생성 시 보이는 Start()와 Update() 외에도 다양한 이벤트가 있는 것을 확인할 수 있습니다.

*MonoBeahaviour에 대한 자세한 내용은 유니티 Docs에 자세히 나와 있습니다 => 링크

여기서 각각의 이벤트가 무엇인지 아는 것도 중요하겠지만,
이벤트의 라이프 사이클에 대해서 아는게 우선이라고 생각했습니다.
순서를 통해서 게임 오브젝트는 개발자 혹은 유저가 원하는 순서대로 움직이고 행동합니다.

순서가 뒤죽박죽 되지 않도록 유니티에서 사이클을 구현해 제공해주는 것이 아닐까 생각했습니다.



유니티 스크립트 수명 주기 플로우 차트


위 사진은 역시나 유니티 Docs에서 가져온 것 입니다. => 링크

위 사이클은 씬이 로드될 때 호출이 된다고 합니다.
예를 들면 게임에서 맵을 다른 방으로 이동해서 씬이 바뀔 때 로드되는 것입니다.

로드가 되면서 전부 게임 오브젝트가 활성화 되는 것은 아니고,
활성화가 되었을 때 Awake함수를 호출해 라이프 사이클을 타게 됩니다.
*Awake는 인스턴스화 될 때 한 번만 호출됩니다.

여기서 Start는 Init에 포함되어 있는 데 첫 번째 프레임 업데이트 전에 호출 됩니다.
그 다음에 게임 로직에 해다아는 Update 함수에서 대부분의 작업이 수행하고,
렌더링 과정을 통해 유저가 보고 있는 GUI에 프레임 단위로 송출이 됩니다.



MonoBehaviour와 코루틴(Coroutine)


위 내용을 보면서 공식 문서에 코루틴에 대해 꽤 언급이 되어 있었습니다.

코루틴은 나중에 따로 정리할 예정이였는데 간단히 집고 넘어가면 좋을 것 같아서
ChatGPT에게 내용을 물어봤습니다.

실행을 일시적으로 멈추고 나중에 필요한 시점에 재개할 수 있는 함수입니다.
유니티 게임 엔진 뿐만 아니라 다양한 환경에서 자주 사용됩니다.
코루틴을 통해 함수의 실행을 일시 중단하고, 이후 필요한 시점에 중단된 곳부터
다시 시작할 수 있습니다.

  • 함수를 여러 프레임에 걸쳐 실행할 수 있게 한다.
  • 비동기 작업이나 시간에 따라 변화하는 작업을 처리하는 데 유용하다.
  • 복잡한 비동기 처리를 간단하게 만들어주며, 애니메이션, 타이밍, 대기, 스레딩 등 다야한 상황에서 유용하게 활용됩니다.
  • 코루틴을 사용하면 코드를 단계적으로 작성하므로 실행 흐름을 이해하기 쉽다.
  • 코루틴은 주로 유니티의 메인 스레드에서 동작하므로 여러 스레드를 관리하는 복잡함이 없어진다.

코루틴이 멀티스레드 환경에서 작동하는 개념인줄 알았는데 아니였다는 걸 이번에 알았네요.

코루틴을 사용해서 케릭터 공격 같은 이벤트를 구현해놓으면,
그 공격 이벤트가 호출 될 때 다른 스레드가 해당 이벤트를 실행하는 줄 알았는데 아니였습니다.

생각해보면 하나의 이벤트를 실행한다고 스레드를 매번 호출하는 것도 비효율적인 것 같네요.

간단하게 글로 작성하면서 공부 해보면서 조금 정리가 되었습니다.
유니티가 상당히 많은 것들을 해주고 있다는 것도 알게되었습니다.

그리고 유니티 Docs에 자료가 잘 정리되어 있어서 참고하기 상당히 좋을 것 같나고 느꼈습니다.



참고자료


  • Unity Docs - 중요 클래스 - MonoBehaviour => 링크
  • [Unity] : MonoBehaviour 는 무엇인가? => 링크
  • 유니티 Update 함수 => 링크
profile
기술에 대한 고민과 배운 것을 회고하는 게임 서버 개발자의 블로그입니다.

1개의 댓글

comment-user-thumbnail
2023년 7월 19일

글을 읽는 동안 많은 걸 배울 수 있었습니다.

답글 달기