Monobehaviour는 유니티에서 대부분의 게임 오브젝트가 상속 받는 클래스이다.
유니티에서 C# 파일을 생성할 때 상속을 받는 클래스이며 Start, Update등의 생명주기 함수
를 갖는다.
하지만 MonoBehavior는 단순한 C# 클래스가 아니다.
유니티의 게임 오브젝트에 붙은 기본 동작 단위이다.
유니티는 이런한 Monobehaviour에 대해 다음과 같은 기능을 제공한다.
public class NewMonobehaviour : MonoBehaviour {
void Start() {
// 초기화 로직
}
void Update() {
// 매 프레임마다 호출
}
}
유니티는 게임 엔진의 핵심 로직을 c++로 구현하고, 그위에 C# 레이어(Mono/.NET)를 추가하는 구조이다.
그렇기에 C# 코드의 실제 동작은 C++코드로 동작한다.
유니티의 게임 오브젝트, 컴포넌트는 C++ 객체로 구성되어 있다.
이를 바인딩이라 하며 C++ 엔진이 C# 스크립트를 호출하고 이벤트를 전달할 수 있도록 구성된다.
게임 오브젝트에 컴포넌트(PlayerController)가 붙음
-> 유니티는 C++쪽에서 게임 오브젝트를 생성하고 내부적으로 Monobehaviour 객체를 할당한다.
-> C++에서 C# 런터임을 호출하여 PlayerController 인스턴스를 생성
-> 매 프레임마다 C++ 엔진이 Update등의 생명주기 함수를 호출 여부를 체크하고 C#에서 이를 실행
Monobehavior는 일반적인 C#과 다르게 작동한다.
C#
일반적인 클래스로 C++과 연결되지 않는다.
new()를 통해 객체 생성한다
게임 오브젝트에 컴포넌트로 부착 불가능하다
생명주기 함수가 없다
Unity
C++ 엔진과 연결된다.
new()가 아닌 Instantiate, GetComponent를 이용해 생성한다.
게임 오브젝트에 컴포넌트로 부착 가능
유니티는 IL2CPP(Intermediate Language To C++)라는 기술을 통해 최종적으로 C# 코드조차도 C++로 변환하여 빌드할 수 있다.
개발중에는 Mono를 통해 C#으로 실행되며 빌드시 IL2CPP를 통해 C++로 변환되어 네이티브 바이너리에 포함된다.
즉 유니티의 C# Monobehaviour는 C++로 변환된 네이티브 코드로 변환된다.