[Unity][AOS] Creating an Android Plugin for Unity (1/2)

koo00·2022년 6월 3일
0

Unity Plugin

목록 보기
1/4

유니티에서 안드로이드 플러그인을 만들고 사용하는 방법에 관한 포스팅이다.
이번 포스팅에서는 자바 플러그인, 다음 포스팅에서 네이티브 플러그인 사용 방법에 대해 다룰 것이다.

테스트 환경은 다음과 같다.
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_PATHC:\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);
        }
    }
}


ButtonText 하나씩 화면에 세팅하고 각각 AndroidPlugin.cs 파일을 컴포넌트에 추가한다.

Button 에는 onClickListener 를 지정해주고 토스트로 띄울 메시지를 입력한다.

빌드 후 앱을 실행시키면 패키지명과 토스트가 잘 뜨는 것을 볼 수 있다.

profile
JFDI !

0개의 댓글