유니티에서 안드로이드 플러그인을 만들고 사용하는 방법에 관한 포스팅이다.
이번 포스팅에서는 자바 플러그인, 다음 포스팅에서 네이티브 플러그인 사용 방법에 대해 다룰 것이다.테스트 환경은 다음과 같다.
Unity 2021.3.1f1 / Android Studio Bumblebee (2021.1.1) / Android 11
먼저 Unity
에서 플러그인 테스트를 위한 프로젝트를 하나 만들어준다.
다음으로 Android Studio
에서 빈 프로젝트를 하나 만들어준다.
File
> New
> New Module
> Android Library
에서 모듈 하나를 추가해준다.
만약 모듈을 추가하지 않고 기존 프로젝트에서 라이브러리로 빌드하고 싶다면 gradle 파일을 아래와 같이 수정해주면 된다.
이번 포스팅에서는 프로젝트를 생성할 때 만들어진 폴더를 사용하지 않으니 File
> Project Structure
> Modules
메뉴로 접근해서 삭제해준다.
안드로이드 스튜디오에서 유니티 액티비티를 사용하기 위해 유니티 폴더에서 classes.jar
파일을 가져와서 AndroidPlugin\libs
폴더에 넣어준다.
classes.jar
파일의 경로는 다음과 같다.
UNITY_PATH\Data\PlaybackEngines\AndroidPlayer\Variations\il2cpp\Release\Classes\classes.jar
나의 경우 UNITY_PATH
는 C:\Program Files\Unity\Hub\Editor\2021.3.1f1\Editor\
이다.
build.gradle
파일에 접근해서 dependencies 에 한 줄을 추가해주고 나머지는 삭제한다. 이때 compileOnly
는 빌드 시 에러가 나지 않도록 하며 빌드 결과 aar 파일에 해당 라이브러리를 포함하지 않는 옵션이다.
plugins {
id 'com.android.library'
}
android {
...
}
dependencies {
compileOnly files('libs\\classes.jar')
}
다음 새로운 자바 파일을 하나 생성하고
간단하게 패키지명을 가져오는 함수와 토스트를 띄우는 함수를 작성했다.
package com.example.androidplugin;
import android.app.Activity;
import android.widget.Toast;
import com.unity3d.player.UnityPlayer;
public class AndroidPlugin {
private static AndroidPlugin _instance;
private static Activity _context;
public static AndroidPlugin instance() {
if(_instance == null) {
_instance = new AndroidPlugin();
_context = UnityPlayer.currentActivity;
}
return _instance;
}
public String getPackageName() {
return _context.getPackageName();
}
public void showToast(String message) {
_context.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(_context, message, Toast.LENGTH_SHORT).show();
}
});
}
}
이제 작성이 끝났기 때문에 빌드해야 하는데 Gradle View
에서 Task
가 보이지 않는다면
File
> Settings
> Experimental
> Do not build Gradle task list during Gradle sync
옵션 체크를 해제하고
Gradle View
> Reload Gradle Project
또는 File
> Sync Project with Gradle Files
를 실행시켜주면 된다.
Gradle View
> AndroidPluginExample
> Tasks
> build
> assemble
더블 클릭 또는 Run
빌드 결과 aar 파일 두 개가 떨어진다.
Unity 프로젝트로 돌아와서 Assets
> Plugins
> Android
폴더를 하나 만들고 해당 폴더에 AndroidPlugin.aar
파일을 넣어준다.
aar 파일은 zip 확장자로 바꾸면 파일 목록들을 확인할 수 있는데, AndroidPlugin.aar
파일 대신 classes.jar
파일을 넣어줘도 된다.
Assets
> Plugins
> AndroidPlugin.cs
파일을 생성해서 아래 코드를 작성한다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class AndroidPlugin : MonoBehaviour
{
AndroidJavaClass AndroidPluginClass;
AndroidJavaObject _instance;
Text _text;
// Start is called before the first frame update
void Start()
{
AndroidPluginClass = new AndroidJavaClass("com.example.androidplugin.AndroidPlugin");
_instance = AndroidPluginClass.CallStatic<AndroidJavaObject>("instance");
_text = GetComponent<Text>();
if(_instance != null) {
_text.text = _instance.Call<string>("getPackageName");
}
}
// Update is called once per frame
void Update()
{
}
public void showToast(string message) {
if(_instance != null) {
_instance.Call("showToast", message);
}
}
}
Button
과 Text
하나씩 화면에 세팅하고 각각 AndroidPlugin.cs
파일을 컴포넌트에 추가한다.
Button
에는 onClickListener
를 지정해주고 토스트로 띄울 메시지를 입력한다.
빌드 후 앱을 실행시키면 패키지명과 토스트가 잘 뜨는 것을 볼 수 있다.