오르카의 아틀리에


언리얼이 확실히 무료화를 선언한 뒤 학생이나 인디게임 개발자가 좀 더 쉽게 접근할 수 있게 된 것은 사실이지만 경쟁 엔진인 유니티보다 자료를 찾는 것에 있어서 힘이든 것이 사실이다. 지금까지 주류 사용처가 기업이었기 때문인게 아닌가 싶다.


특히 모바일 자료는 정말 찾기 힘든데 Android에서 Bluetooth를 이용하기 위해서 여러 자료를 찾아보았지만 쉽게 자료를 찾을 수는 없었다. (구글을 사용하면 원하는 자료가 적고, 엔진소스를 읽으면서 공부하자니 광활한 소스코드에 우주미아가 된 것 같았다.)



사실, 결국 알아내었고 플러그인을 만들어서 경험과 코드를 공유하려 하고 있지만, 이것이 현업에서 사용하거나 언리얼 엔진이 권장하는 통상적인 방법인지는 아직 잘 모르겠다. 여튼 나처럼 언리얼 엔진은 초심자이지만 모바일로 빌드할 때 안드로이드의 코드나 기능을 사용하고 싶어하는 사람을 위해 포스팅을 남긴다.


준비물

일단 유니티처럼 원하는 안드로이드 기능을 구현한 jar 파일이 필요하다. 그냥 생 java 파일로도 가능하지만 그렇게 관리하다가 파일하나 유실하면 대략 난감하니 앵간하면 jar을 사용하도록 하자. (예제에서는 파일이 2개뿐이라 그냥 java파일을 사용했다 패키징...귀찮아...)


유니티는 aar도 지원한다고 하지만 일단 내가 필요했던 기능은 jar로도 간편하게 구현할 수 있기 때문에 java 파일만 사용했다. 응?! static library가 필요하다면 추가할 수 있으니 챙겨두도록 하자.


폴더 배치


뒤에 설명할 부분에서 잘 처리한다면 어느 폴더에 배치해도 상관없을 것 같지만, 예제에서는 Source 폴더 밖에 ThirdPartyLibraries/Android 폴더를 만들어두고 그 안에 패키지명으로 폴더 패스를 구성하여 배치하였다.


유니티에서 안드로이드 빌드를 하게 되면 비슷한 과정을 거치는 것같다. jar이나 안드로이드 관련 파일들을 복사해서 안드로이드 프로젝트에 맞게 재배치 하는 것처럼 보이기 때문이다. 하지만, 유니티 처럼 "Assets/Plugin/Android 경로에 있는 것만 복사한다"는 조약이 없는 것 같으므로 우리가 필요한 파일 패스를 직접 알려주어 Copy 해야 한다. 이 기능은 Unreal Plugin Language (UPL) 을 이용하여 간단하게 해결할 수 있다.


UPL이란?

언리얼에서 플러그인과 패키징할때 글로벌한 세팅들을 할 수 있게 해주는 친구이다. 예를 들어 안드로이드 매니페스트를 수정한다든지 iOS의 plist를 수정한다든지 패키징에 포함될 파일들의 경로를 설정한다든지의 작업을 할 수 있게 해준다. github에 있는 Unreal Engine 레포의


UnrealEngine/Engine/Source/Programs/UnrealBuildTool/System/UnrealPluginLanguage.cs

를 살펴보면 UPL 태그들이 어떤 역할을 하는지에 대한 설명이 주석으로 달려있다. 대신 일단 예제로 만든 UPL의 소스를 살짝 맛보자. (직접 링크를 걸고 싶지만 언리얼 멤버쉽에 가입하고 깃허브와 연동해야만 볼 수 있는 private 레포이기 때문에 경로만 남겨둔다.) 



위 소스는 내가 만든 예제에서 사용한 UPL 코드인데 여기서 사용한 태그들만 의미를 좀 보자


<androidManifestUpdates>를 보자면 안드로이드 기능을 이용하는 데 필요한 권한을 업데이트 하고있는 모습이다. 이 태그를 통해 퍼미션 뿐만 아니라 다른 안드로이드 매니페스트 구문들을 업데이트할 수 있다. 다른 태그들도 비슷하다 주로 해당 파일의 특정 위치에서 내용을 삽입하겠다 혹은 파일을 어디에서 어디로 카피하겠다 라는 수준의 구문들이다.


<proguardAdditions>를 통해서는 추가할 패키지들의 프로가드 설정을 할 수 있다.

<prebuildCopies>는 빌드 되기 전 파일들을 카피할 수 있다.

<gameActivityOOOAdditions>들은 GameActivity의 000 부분에서 추가적인 자바코드를 삽입할 수 있다. 예제에서는 Import 부분과 Class 내부의 자바코드를 추가 수정하였고, 뿐만 아니라 Activity 생명 주기에 필요한 함수들에도 코드를 삽입할 수 있도록 별도의 태그들이 준비되어있다. 자세한 태그 분류들은 위에서 설명한 경로를 통해 주석으로 확인할 수 있다.


마무리

Unreal에서 유니티에 비해 특별하게 작업해야 하는 정도는 이 정도이다. 이렇게 작업한 뒤 JNI를 이용하여 필요한 함수들을 만들어 내고 작업하면 된다. 아직 모든 기능을 구현한 것은 아니지만, 코드상으로는 문제가 없어 빌드가 되는 예제 프로젝트의 링크를 남겨 둘 테니 부끄럽지만 읽어보고 도움이 되었으면 좋겠다.