유니티엔진에서 ‘스크립트’를 작성한다고 하면, 보통 MonoBahaviour를 상속받는 클래스의 스크립트를 작성하는 것을 떠올릴 것이다. 그리고 자연스럽게 이 클래스 내에 Awake(), Start(), Update() 등의 메소드를 작성하게 된다.
심지어 비주얼 스튜디오 같은 개발 환경에서는 이런 메소드들에 대해 자동 완성도 해주고, 메소드 위에는 Unity 메시지라는 글자도 띄워준다. 이런 메소드들은 ‘Unity Event Function’, ‘Unity Message’ 또는 ‘Magic Method’라고 불린다.
그런데 생각해보면 이 메소드들은 MonoBehaviour 또는 그 부모 클래스로부터 상속받은 메소드도 아닌데, 어떻게 유니티가 알아서 찾아 적절한 타이밍에 호출해줄 수 있는 걸까? SendMessage() 메소드는 리플렉션을 기반으로 동작한다는데, 이벤트 함수도 마찬가지일까?
유니티는 내부적으로 리플렉션을 이용해 매직 메소드를 호출하지 않는다.
Mono 또는 IL2CPP와 같은 스크립팅 런타임에 의해 CIL Code의 MonoBehaviour에 접근할 때, 매직 메소드의 작성 여부를 검사하여 이를 캐싱한다.
Mono & IL2CPP
이를 이해하기 위해서는 일단 닷넷의 CLR과 CIL에 대해 이해할 필요가 있다.
CIL
- Common Intermediate Language, 공통 중간 언어
- .NET 고유의 객체지향 어셈블리 언어
- .NET 환경에서 타겟 플랫폼에 관계 없이 자유롭게 개발할 수 있도록 도와주는 녀석
CLR
- Common Language Runtime 공통 언어 런타임
- CIL Code > Native Code로 컴파일 해주는 가상 머신
Mono와 IL2CPP란, CIL Code를 Native Code로 컴파일해주는 스크립팅 백엔드이다. 그러니까, .NET Framework에서 CLR이 수행하는 역할을 유니티에서 해주는 녀석들이다.
Mono는 JIT 컴파일을 통해 CIL Code -> Native Code로 변환해주고,
IL2CPP는 AOT 컴파일을 통해 CIL Code -> .NET Native Code로 변환해준다.
Mono는 유니티 자체 개발이 아니며, IL2CPP는 유니티 자체 개발이다.
빌드 시간은 Mono가 IL2CPP보다 빠르고, 성능과 보안성은 IL2CPP가 Mono보다 좋다.
'게임엔진 > Unity' 카테고리의 다른 글
[Unity] 2D 게임의 기본 타일맵! (0) | 2023.07.21 |
---|---|
[Unity] (Rule Tile)룰 타일로 타일맵 자동 연결하기 (0) | 2023.07.21 |
[Unity] 강체 관련 Rigidbody / AddForce / AddTorque (0) | 2023.06.27 |
[Unity] 트랜스폼(Transform) 이동(Move) (0) | 2023.06.27 |
[Unity] 오브젝트의 활성화 상태 확인 (0) | 2023.06.01 |