유니티에서 사용하는 안드로이드 플러그인 파일은 두가지로 구분된다. JAR과 AAR이다.
JAR은 class만 포함된 파일이고, AAR은 class + manifest + resource가 전부 포함된 파일이다.
class만 사용할 경우 JAR 파일만 분리해서 plugins 폴더에 넣어주면 되고
manifest와 resource가 필요하다면 AAR 파일 그대로 plugins 폴더에 넣어주면 된다.
우선 안드로이드 프로젝트를 생성한다.
- 어차피 새 모듈을 추가할 것이므로 Template은 아무거나 선택한다.
- 프로젝트 이름도 편한대로 아무거나 입력한다.
- SDK 버전은 유니티에서 기본값으로 API 19: Android 4.4로 설정되어 있기에 같은 버전으로 하였다. 그 이상 버전으로 설정하면 유니티에서도 Project Settings에서 맞춰주어야 한다. 그렇지 않으면 유니티 빌드시 에러난다.
프로젝트가 생성되면 File -> New -> New Module 로 모듈을 추가한다.
Android Libray를 선택하고, 원하는 이름으로 모듈을 생성한다.
이제 Unity 폴더에서 classes.jar 파일을 찾아서, 안드로이드 프로젝트의 plugin/libs 폴더에 복사한다.
- 유니티 classes.jar 파일경로 (참 길기도 하다..)
C:\유니티폴더\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\il2cpp\Release\Classes
(windows 유니티폴더: C:\Program Files\Unity\Hub\Editor\2019.4.16f1)
(app/libs 폴더에 넣지않도록 주의한다.)
그 다음 build.gradle (Module: UnityPlugin.plugin) 파일을 열어서
(Module: UnityPlugin.app을 열지않도록 주의한다.)
dependencies에 compileOnly fileTree()를 추가하고, 우측 상단의 Sync Now를 클릭한다.
(libs 폴더의 유니티 classes.jar을 사용하기 위함이다. sync가 되면 com.unity3d.player.UnityPlayer 클래스를 사용할 수 있다.)
1
2
3
|
dependencies {
compileOnly fileTree(dir: 'libs', include: ['*.jar'])
}
|
cs |
기본 준비가 끝났다.
이제 plugin 모듈에 UnityPlugin 클래스를 생성하고 코드를 작성한다.
(class 이름이 빨간색으로 나오는 경우, 그 위치에 커서를 놓고 Alt + Enter를 하면 네임스페이스가 자동 추가된다.)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
public class UnityPlugin
{
private static UnityPlugin _instance;
private static Activity _context;
public static UnityPlugin instance()
{
if (_instance == null) {
_instance = new UnityPlugin();
_context = UnityPlayer.currentActivity;
}
return _instance;
}
public String getPackageName()
{
return _context.getPackageName();
}
public void showToast(String text)
{
_context.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(_context, text, Toast.LENGTH_LONG).show();
}
});
}
public void unitySendMessage(String objectName, String methodName, String param)
{
UnityPlayer.UnitySendMessage(objectName, methodName, param);
}
}
|
cs |
코드 작성을 마치면 우측 Gradle탭을 클릭하고, plugin/Tasks/build/assemble을 더블클릭하여 빌드한다.
(app/.../assemble로 빌드하지 않도록 주의한다.)
빌드가 완료되면 plugin/build/outputs/aar 폴더에 AAR 파일이 생성된것을 확인할 수 있다.
AAR 파일은 (APK처럼) 사실 ZIP 압축파일이다.
따라서 윈도우 탐색기에서 확장자를 zip으로 변경한 후 압축을 풀어줄 수 있다.
압축을 풀어 나온 폴더를 열어보면
- AndroidManifest.xml
- classes.jar
- R.txt
파일들이 포함된 것을 확인할 수 있다.
현재 빌드된 라이브러리에는 리소스가 없어 리소스 파일이 포함되지 않았지만
라이브러리에 리소스를 추가하여 빌드하면 리소스 파일도 AAR 파일에 포함된다.
이제 유니티의 plugins 폴더에 classes.jar 파일이나 plugin-release.aar 파일을 복붙한다.
(플러그인에서 Manifest나 Resource를 사용하지 않는다면 classes.jar 파일만 가져오면 되지만
이래저래 번거롭다 싶으면 그냥 AAR파일을 가져오면 된다.)
테스트를 위해 Text, Button UI를 만들고 스크립트를 작성하여 참조한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class AndroidPluginSample : MonoBehaviour
{
[SerializeField] Text _text;
[SerializeField] Button _button;
AndroidJavaObject _pluginInstance;
void Awake()
{
var pluginClass = new AndroidJavaClass("com.example.plugin.UnityPlugin");
_pluginInstance = pluginClass.CallStatic<AndroidJavaObject>("instance");
_text.text = _pluginInstance.Call<string>("getPackageName");
_button.onClick.AddListener(() =>
{
_pluginInstance.Call("unitySendMessage", gameObject.name, "CallByAndroid", "Hello Android Plugin!");
});
}
void CallByAndroid(string message)
{
_pluginInstance.Call("showToast", message);
}
}
|
cs |
이제 APK를 빌드하여 폰에 설치하고 실행하면..
MISSION COMPLETE!