#[環境]
OS: windows10 pro
IDE:Android Studio4.0.1
Unity 2019.4.5f1
確認した実機: Galaxys8
#[参考]
[Android用Plugin(java[aar])の作成(https://qiita.com/fukaken5050/items/c9ac144344c5f6ff9f57)
https://dream-target.jp/2019/01/04/unity_android/
https://qiita.com/okuhiiro/items/1aaec487d1ab8b086095
https://ghoul-life.hatenablog.com/entry/2019/01/26/030622
https://note.com/attomicgm/n/ncb22f460e8b6
https://gaprot.jp/2020/03/30/unity-android-native-plugin/
https://baba-s.hatenablog.com/entry/2018/09/18/170000 確認済
本文
UnityでAndroidProjectを出力する
・適当にCUBE等を配置する。
・Unityでプロジェクトを作成する(例:TestAndroidPlugin)
・「ExportProject」「DevelopmentBuild」にチェックします。
・AndroidにスイッチしバンドルIDを設定する。
・com.ore.TestAndroidPlugin) → Javaでは重要なので意識してください。com.ore.TestAndroidPluginとなってる華胥ありますが私はここでつまづきました
・MinimumAPILevelを設定する(例:Android4.4 APILevel19) デフォルト
・Unityプロジェクトと同じフォルダにExport用フォルダを作成し、フォルダに移動してから「フォルダの選択」を押す(例:TestAndroidPlugin\Android)
・AndroidStudio用プロジェクトが生成される
AndroidStudioで読み込む
UnitySDKかAndroidStudioのSDKを使うか指定する。
プロジェクト解析にすこし時間がかかります。
・ビルドエラーは出ず問題なく実行できます。
#Unityの機能をAndroidから使うため、classes.jar/android.jarを配置します。
今回の環境では以下に存在しました。
C:\Program Files\Unity\Hub\Editor\2019.4.5f1\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes
C:\Users\user\AppData\Local\Android\Sdk\platforms\android-30
C:\Android\SDK\platforms\android-30
プラグインモジュールの追加
・メニューの「File」>「New」>「NewModule」を押す
・「AndroidLibrary」を選択し、「Next」を押す
・「Application/Library name」を設定する(例:UnityPlugin)
・「Package name」を右側の「edit」を押し、設定し、「done」を押す(例:com.ore.unityplugin)
・「MinimumSDK」をUnityに設定したものと同じか、小さいものに設定する(例:API23)
・「Finish」を押す
■「build.gradle」の編集
Unityライブラリファイル"unity-classes.jar"(またはclasses.jar)を、出力されるaarファイルに含めないようにします。
//classes.jarファイルは、コンパイルのときのみ使用する
//Android Studio 3系では、「implementation fileTree」と記述すると
//classes.jarも含まれてしまうため「compileOnly」と記載して
//jarファイルはコンパイルのみ使用するようにします。
dependencies {
//implementation fileTree(dir: "libs", include: ["*.jar"]) NG
compileOnly fileTree(dir: 'libs', include: 'unity-classes.jar')
implementation 'androidx.appcompat:appcompat:1.2.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}
・右上に出ている「SyncNow」を押す
#プラグイン用javaクラスの追加
・プロジェクトツリーから「プラグイン名」>「Java」>「パッケージ名」を選択(例:unityplugin>Java>com.ore.unityplugin)
・(AndroidTest)や(Test)と書かれていないもの(一番上)
・メニューの「File」>「New」>「JavaClass」を押す
・「Name」を設定(例:TestPlugin)
・「OK」を押す
・以下はトースト表示する簡単なサンプル
package com.ore.unityplugin;
import android.app.Activity;
import android.widget.Toast;
import com.unity3d.player.UnityPlayer;
public class TestPlugin
{
public static void showToast(final String message) {
final Activity activity = UnityPlayer.currentActivity;
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(activity, message, Toast.LENGTH_SHORT).show();
}
});
}
}
UnityPlayerでビルドエラーがでるので、unityLibrary-libsの[unity-classes.jar]を UnityPlugin-libsにコピーする。IDE右上の[SyncProject with Gradle]を押すとビルド成功します。
・aarのサイズは16K程度です。100kくらいある場合はunity-classes.jarも含んでおり、プラグイン利用時にUnityが持つJarと衝突します。
作成したPluginを使う
UnityProject/Asset/Plugins/Androidに作成したプラグイン *.aar を配置する。
#スクリプト
TestPlugin を作成して適当なGameObjectに配置する。UnityでButtonとTextを生成してTestPlugin と接続する。
最後にAndroid実機で動作確認をする。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class TestPlugin : MonoBehaviour
{
[SerializeField] private Button _button = null;
public Text m_text = null;
private void Start()
{
_button.onClick.AddListener(() => OnButtonClick(_button));
m_text.text = "start";
}
private void OnButtonClick(Button button)
{
m_text.text = "OnButtonClick_1";
using (AndroidJavaClass javaClass = new AndroidJavaClass("com.ore.unityplugin.TestPlugin"))
{
Debug.Log("OnButtonClick");
m_text.text = "OnButtonClick_2";
javaClass.CallStatic("showToast", "Test");
}
}
}