Unity Project에서 모노(Mono) DLL의 사용

일반적으로, 스크립트는 프로젝트 내에서 소스파일로 보관되고 소스가 변경될 때 마다 Unity에 의해 컴파일 됩니다. 하지만, 외부 컴파일러를 사용하여 스크립트를 _dynamically linked library_ (DLL)로 컴파일 하는 것도 역시 가능합니다. 그 결과로 생성되는 DLL은 프로젝트에 추가될 수 있고 그것이 포함하는 클래스는 정상적인 스크립트와 마찬가지로 오브젝트에 부착될 수 있습니다.

Unity에서 일반적으로는 스크립트로 작업하는 것이 DLL 보다 훨씬 쉽습니다. 하지만, DLL의 형태로 제공되는 타사의 모노(Mono) 코드로 작업해야 할 경우가 있을 수 있습니다. 자신의 코드를 개발할 때도, Unity가 지원하지 않는 컴파일러(예: F#)을 사용할 경우, 그 코드를 DLL로 컴파일 하여 사용자의 Unity 프로젝트에 추가함으로써 사용 수 도 있을 것 입니다. 또한, Unity 코드를 소스 코드 없이 제공하고 싶을 경우(예:에셋 스토어 제품으로), DLL을 사용하면 손쉽게 해결됩니다.

DLL의 생성

DLL을 만들려면, 우선 적당한 컴파일러가 있어야 합니다. .NET 코드를 만들어내는 모든 컴파일러가 Unity와 작동하는 것은 아니므로, 중요한 작업에 들어가기 전에 가지고 있는 코드로 컴파일러를 테스트해 볼 것을 권장합니다. 만일 DLL이 Unity API와 전혀 무관한 코드만 포함한다면, 그러면 사용자는 단순히 적절한 컴파일러 옵션을 사용하여 이를 DLL로 컴파일 할 수 있습니다. 만일 사용자가 Unity API을 사용하고 싶다면, Unity의 DLL을 컴퓨터가 사용할 수 있게 해 주어야 합니다. Mac에서는 이는 프로그램 번들(bundle)에 포함되어 있고(이 번들의 내부 구조를 보고 싶다면, 컨텍스트 메뉴에서 Show Package Contents을 사용합니다; 그 Unity 프로그램을 마우스 오른쪽 버튼으로 클릭하거나 ctrl-click을 합니다):-

Unity DLL의 경로는 일반적으로 다음과 같습니다.

/Applications/Unity/Unity.app/Contents/Frameworks/Managed/

…그리고 그 두 개의 DLL은 UnityEngine.dll 과 UnityEditor.dll이라 불립니다.

윈도우에서는, DLL은 Unity 프로그램이 있는 폴더에 함께 위치합니다.

C:\Program Files (x86)\Unity\Editor\Data\Managed

… Mac OS에서도 DLL의 이름은 동일합니다.

DLL을 컴파일 하는 정확한 옵션은 사용하는 컴퓨터에 따라 달라집니다. 예를 들어, Mono C# 컴파일러의 명령라인인 _mcs_는 Mac OS에서는 다음과 같습니다:-

mcs -r:/Applications/Unity/Unity.app/Contents/Frameworks/Managed/UnityEngine.dll -target:library ClassesForDLL.cs 

여기서 -r 옵션은 빌드에 포함될 라이브러리로 가는 경로로, 이 경우는 UnityEngine 라이브러리 입니다. -target 옵션은 어느 타입의 빌드가 필요한지를 명시합니다. "library"란 단어는 DLL 빌드를 선택하기 위하여 사용되었습니다. 마지막으로, 컴파일 해야 하는 소스파일의 이름은 ClassesForDLL.cs 입니다(여기서 이 파일은 현재 작업 폴더에 있다고 가정하지만, 필요 시 그 파일의 경로 전체를 명시할 수 있습니다). 모든 것이 잘 진행된다고 가정하면, 결과로서 생기는 DLL 파일은 소스 파일과 같은 폴더에 바로 나타날 것 입니다.

DLL의 사용

일단 컴파일이 되면, DLL 파일은 다른 에셋과 마찬가지고 Unity 프로젝트로 간단하게 드래그 될 수 있습니다. DLL 에셋은 라이브러리 내의 별도의 클래스를 드러내는 데 사용할 수 있는 폴드아웃 트라이앵글(foldout triangle)을 가지고 있습니다. MonoBehaviour에서 파생 된 클래스는 다른 보통 스크립트와 마찬가지고 Game Objects위에 드래그 될 수 있습니다. Non-MonoBehaviour 클래스는 일반적인 방법으로 다른 스크립트에서 직접 사용될 수 있습니다.


클래스를 볼 수 있게 펴진 DLL

역링크