본문 바로가기

게임 프로그래밍/unity

유니티에 대한 오해와 진실

 여태까지 유니티 개발환경에 대해 아주 큰 오해를 한 가지 하고 있었는데, 안드로이드 앱이 빌드되는 과정이 나는 자바로 변환되어 라이브러리 처럼 사용된다는 말도 안되는 생각을 갖고 있었다. 아무튼, 유니티는 리눅스 커널 위에 MONO 라는 닷넷 VM을 통해 기존의 C# 및 Unity 코드를 기동할 수 있다.

 Unity 역시 C#으로 구현된 스크립트를 Assembly 코드로 컴파일해 두고, MONO의 JIT Runtime 위에서 기동이 가능하다. 결국 한 마디로 C#(Managed) 및 기존 C/C++ 코드를 안드로이드 폰에서 사용할 수도 있다는 말이다.


아무튼 구글링 내역과 간략한 소개다.

The Mono Runtime

Runtime Doc.

Mono Embedding

Xamarine Architecture


JIT 컴파일

최근의 자바 가상 머신과 .NET에서는 JIT 컴파일을 지원한다. 즉, 자바 컴파일러가 자바 프로그램 코드를 바이트코드로 변환한 다음, 실제 바이트코드를 실행하는 시점에서 가상 머신이 바이트코드를 기계어로 변환한다.


가장 궁금하게 생각 되었던 점이 APK 파일 내에 JAR는 하나도 없고, 모두 DLL만 존재하는가 였는데, 그러한 궁금증이 풀렸다. 

안드로이드 OS 역시 리눅스 커널위에 존재하며, 해당 커널위에서 동작하는 라이브러리(libmain.so, libmono.so, libunity.so)를 통해 Mono Runtime 이 기동되고, 그 런타임 환경위에서 내가 만든 C# 및 Unity 코드가 돌아가기 때문이며, 해당 C# 코드는 Assembly 코드로 존재하며, JIT 컴파일을 통해 실제 운영 시에 기계어로 번역되어 프로그램이 실행된다.


자마린 Architecture 인데, 아래와 같이 리눅스 커널위에 동작하는 두 VM을 통해서 Unity 게임이 기동된다. Managed Call Wrapper 와 Android Call Wrapper 를 통해 서로간의 JNI 및 Method 호출은 가능하다.


잘 짜여진 기존 C/C++ 코드가 존재한다면 모를까 새로 개발하는 거라면 굳이 Unmanaged 코드를 포함하면서까지 복잡하게 구현할 필요는 없을 것 같고, C#으로 Managed Code로 개발하는 것이 좋다고 본다.

아래는 C# Managed Code 를 통해 Existing C code 를 Mono Runtime 위에서 호출.


참고 링크

http://blog.naver.com/linegamedev

http://www.hanbit.co.kr/network/columnview.html?bi_id=1829

http://xlevel75.blogspot.kr/2011/12/unity3d-javaplugin.html

http://www.unitystudy.net/bbs/board.php?bo_table=dustin&wr_id=8&page=3

http://docs.unity3d.com/Manual/UsingDLL.html

http://ericeastwood.com/blog/17/unity-and-dlls-c-managed-and-c-unmanaged



'게임 프로그래밍 > unity' 카테고리의 다른 글

유니티 네트워크 프로그래밍  (0) 2015.04.14
3D 러닝게임 리뷰  (0) 2015.03.14
유니티 튜토리얼 1  (0) 2015.03.12