Unity

Unity Android Plugin 만들기

CommitGuy 2024. 1. 28. 14:36

Unity에서 기본으로 지원해주지 않는 기능을 지원하기 위해서나 Native에 내가 구현해놓은 기능을 Unity에 사용하기 위해선 Plugin을 만들어야 함.

 

필자도 Native에 만들어놓은 기능을 Unity에서 사용하기 위해 Plugin 제작을 하는데 매번 만들때마다 어떻게 만들었는지 까먹어 내가 필요할 때 참고 하기 위해 블로그에 정리함.

 

  • 개발 환경
    • PC: Mac
    • Android Studio: Hedgehog | 2023.1.1
    • Unity: 2021.3.11f1

 

- Android Project 생성

Android Project 생성

먼저 Android Project를 생성해 준다. 본인이 만들고자 하는 Plugin의 성격에 따라 원하는 Template를 설정한다.

필자의 경우 "No Activity"를 많이 사용.

 

- Android Module 생성

Module 생성(File > New > New Module)

Module을 생성한다. File > New > New Module을 클릭

 

모듈 생성 (Templates > Android Library)

Templates > Android Library를 선택, Module 이름과 Package 이름을 선택하고 사용하고자 하는 언어(Language) Java를 쓸지 Kotlin을 쓸지 선택한다. 그리고 최소 지원 SDK(Minimum SDK)를 선택한다.

필자의 경우 Kotlin을 잘 알지 못해 이 블로그는 Java를 기준으로 서술한다.

 

- Module에 Unity Jar를 추가

Project로 들어가 [생성된 Module] > libs 에 classes.jar 추가

Project 탭으로 열어 생성된 모듈(필자의 경우 BrainExtensionPlugin Module)아래 libs directory안에 Unity의 classes.jar 를 넣는다.

 

Unity의 classes.jar 위치의 경우 Mac 기준으론 아래와 같다

/Application/Unity/Hub/Editor/[본인이 사용하는 Unity Version]/PlaybackEngines/AndroidPlayer/Variations/il2cpp/Release/Classes

 

 

https://hankyo-dev.tistory.com/entry/Mac%EC%97%90%EC%84%9C%EC%9D%98-classesjar-%EC%9C%84%EC%B9%98

 

Mac에서의 classes.jar 위치

Unity로 Android Plugin을 개발하기 위해선 해당 유니티 버전의 classes.jar 파일이 필요하다 Mac에서 classes.jar의 위치는 아래와 같다 /Applications/Unity/Hub/Editor/[Unity Version]/PlaybackEngines/AndroidPlayer/Variations/il2c

hankyo-dev.tistory.com

 

- Module의 gradle 편집

classes.jar를 참조하기 위해 추가

Module의 build.gradle에 아래의 명령어를 추가

compileOnly(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar"))))

 

예전에는 compileOnly fileTree(dir: 'libs', include:['*.jar']) 로 추가 했는데 Android Studio를 Hedgehog로 업데이트 했더니 바꿔줘야 했음

 

- Class 추가

package com.commitguy.brainextensionplugin;

import android.app.Activity;
import android.widget.Toast;

import com.unity3d.player.UnityPlayer;

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);
    }
}

 

- assembleRelease

aar을 만들기 위해 module을 선택하고 assembleRelease 명령어 수행

module을 선택하고 assembleRelease 명령어를 수행

- aar 생성

aar 위치

aar은 Project에 들어가 내가 만든 모듈 아래 build > outputs > aar 아래 위치함

 

- Unity에 aar 추가

Unity의 Plugins 폴더 아래 aar을 추가하고 아래의 샘플 코드를 수행

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

namespace BrainExtension.Platform.AOS.PluginTest
{
    public class AndroidPluginSample : MonoBehaviour
    {
        [SerializeField] Text _text;
        [SerializeField] Button _button;

        AndroidJavaObject _pluginInstance;

        private void Awake()
        {
            var pluginClass = new AndroidJavaClass("com.commitguy.brainextensionplugin.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);
        }
    }
}

'Unity' 카테고리의 다른 글

Unity Design Pattern - Object Pool  (2) 2024.06.03
유니티 3D Model 파괴 효과 만들기  (0) 2024.02.26
Mac에서의 classes.jar 위치  (0) 2021.10.31
[Unity] Animator Animation 재시작 방법  (0) 2021.10.29
[Unity] Touch for Mobile - Part1  (0) 2021.09.21