[Unity/Android] Android Plugin 제작하기 (part. 1-1)

/// <summary>

/// Unity - Android) Plugin 제작하기 (part. 1-1)

/// @author         : Incentive Code

/// @last update  : 2023. 05. 26

/// @version        : 1.0

/// @update

///     [2023. 05. 26] v1.0 - 최초 작성. 

///        AAR 파일 생성 및 함수 호출 방법 정리

/// </summary>


오랜만에 글을 쓰게 되었네요.

회사에서 2021년 부터 진행 중인 과제의 마무리를 한다고 한동안 바쁜 시간을 보내고 왔습니다... ㅠ


오늘부터 몇 번에 걸쳐서 Unity 에서 사용할 Android Plugin 을 만드는 방법을 정리하려고 합니다.

Unity Document ( 참고 링크 )를 보면, 

Unity 에서 Android Plugin 을 사용하는 방법 5가지를 소개하고 있습니다.

  * AAR 플러그인과 Android 라이브러리

  * JAR 플러그인

  * UnityPlayerActivity Code 확장

  * 네이티브 (C++) 플러그인

  * Java 및 Kotlin 소스 파일을 플러그인으로 사용 

이 중에서 오늘 다뤄볼 내용은 AAR 플러그인 입니다.


지극히 개인적인 경험이지만, 제가 경험한 바로는 

간단한 기능 또는 피드백을 받지 않아도 되는 기능 (예를 들어, Log 또는 Toast 같은) 을 사용할 때 

편하게 사용할 수 있었습니다.

그래서 제가 오늘 정리할 부분들도 아주 간단하지만 중요한,

Log 남기기와 Toast 출력하기 입니다.


우선 이 작업을 하기 위한 프로젝트를 하나 생성하겠습니다.

2D Mobile Core Template 를 선택하고 프로젝트를 생성했습니다.  

프로젝트 이름은 매우 직관적으로 보이게끔, 'plugin_test' 라고 지었습니다.


Log 와 Toast 를 출력하기 위한 용도에 맞게,

InputField 하나와 Button 이 두 개 있는 아주 간단한 UI 를 구성해 주었습니다.

Simple is best...


이 위에서 동작할 스크립트도 하나 추가합니다. PluginTest.cs 라는 이름으로 파일을 하나 생성합니다.


위 코드에서 중요한 파트는 const string 부분과 Awake() 입니다.

PackageName 은 이후에 추가할 Android plugin project 의 패키지 이름입니다.

UnityDefaultJavaClassName 과 UnityDefaultActivityName 은 이 프로젝트가 android app 으로 빌드했을 때 갖게되는 기본 이름 이라고 보시면 되겠습니다.

그 아래 있는 setActivity, androidLog, androidToast 는 kotlin 으로 작성할 함수 이름입니다. plugin 이 가지고 있는 함수를 쉽게 호출하기 위해 따로 적어두었습니다.


그럼, 이번엔 Android Studio 를 이용해서 플러그인 프로젝트를 생성해보겠습니다.
Android Studio 를 실행 후 New Project 메뉴를 선택합니다.

어차피 화면을 그릴 것이 아니니, No Activity 를 선택합니다.


패키지 명은 Unity 프로젝트의 패키지 명과 동일하게 가져갑니다.


프로젝트가 생성되면 Bridge.kt 파일을 생성합니다.

Bridge.kt 의 소스코드에서 중요한 부분은 PluginTest.cs 에서 선언한 이름으로 함수를 생성해주어야 한다는 점 입니다. 그걸 제외하면 아주 간단한 Log.d() 와 Toast() 를 호출하는 내용의 짧은 코드입니다.



코드 작성이 완료 되었다면, Android Studio 에서 몇가지 작업을 더 진행해야 합니다.

우선, 이 프로젝트가 application 이 아니라 library 라는 것을 명시해주어야 합니다.
Module 수준의 build.gradle 파일을 열고, 아래 이미지 처럼 문구를 수정합니다.

id 는 'com.android.application' -> 'com.android.library' 로 변경하고, 
그 아래 있는 applicationId 값은 주석 처리 하거나 삭제합니다.

이런 모양으로 값을 수정하시면 됩니다.


그리고 사용하지 않는 res / 아래의 폴더들을 삭제합니다.
저는 res / xml 폴더를 제외하고는 다 삭제 했습니다.

mipmap 이나 drawable 이 포함된 채로 aar 파일을 빌드해도, 빌드는 정상적으로 되긴 합니다.
하지만 Unity 에 aar 파일을 넣고 빌드할 때, 아래 이미지 같은 오류가 발생합니다.

Android plugin 을 만들다보면 자주 만나는 ActionFacade 그리고 AAPT

마지막으로 Run configuration 을 수정합니다.
Android Studio 의 상단부를 보면 뭔가 문제가 있는 것 같은 그림을 하나 볼 수 있습니다.

저 선명한 X 표를 없애야 합니다.

저 영역을 클릭 후, Edit Configuration 이라는 메뉴를 클릭합니다.
Run/Debug Configuration 라는 창이 하나 열리면, 좌상단의 + 버튼을 클릭하고, Gradle 을 선택합니다.
그러면 자동으로 프로젝트 이름과 동일한 Configuration 이 생성됩니다.

이렇게 생성이 되었다면 성공입니다.

여기까지 오셨으면 이제 aar 파일을 생성할 준비가 완료되었습니다.
Android Studio 의 상단부에 있는 망치 버튼을 클릭해서 aar 파일을 빌드합니다.

build / outputs / aar 아래에 app-debug.aar 이 생성됩니다.


이렇게 생성된 aar 파일을 Unity 의 Assets / Plugins / Android / 아래에 배치합니다.

폴더 경로가 이렇게 됩니다.

이제 Unity 에서 빌드 타겟을 Android 로 설정한 다음 빌드를 해보면 정상적으로 빌드는 됩니다.
네, 빌드는 됩니다.

InputField 에 텍스트를 입력하고 Log 나 Toast 버튼을 클릭하면 바로 에러가 나타납니다.

NoClassDefFoundError ... 필요한 클래스를 runtime 에 찾지 못했다는 의미입니다.

이 부분에 대해 정확하게 이해하진 못해서 더 자세한 설명을 여기에 적지는 못하지만, 어쨌든 해결 방법은 찾았습니다.

Unity 에서 Project settings - Player 설정으로 가면 Publishing Settings 를 조절할 수 있습니다.
여기에서 Custom Launcher Gradle Template 옵션을 활성화 합니다.
활성화 되면 자동으로 launcherTemplate 라는 파일이 생성됩니다.

파일을 열고, 상단에 있는 dependencies 안에 이 한 줄을 추가해줍니다.

implementation 'org.jetbrains.kotlin:kotlin-stdlib:1.8.0'

저는 주석도 한 줄 넣었습니다.

이제 다시 Unity 에서 빌드를 하면, 정상적으로 Log 와 Toast 가 찍히는 것을 확인하실 수 있습니다.


작은 기능이지만, 의도한대로 동작하면 나름 기쁩니다.

네... 이렇게 우여곡절 끝에 아주 심플한 Android Plugin 을 만들었습니다.

다음 업로드 때는 제가 이 작업을 하게 된 'Background Service' 를 실행하는 aar 파일을 만드는 방법을 정리해 보려고 합니다.

제가 개발하면서 경험한 문제들을 정리하는 수준의 글이라, 누군가에게는 정답이 아닐 수 있습니다.
하지만 누군가에게는 도움이 될 수 있다면 기쁠 것 같습니다.

긴 글 봐주셔서 감사합니다.








Incentive Code

여전히. 예술하는 프로그래머, 코딩하는 예술가

댓글 쓰기

다음 이전