UnityPlugin/Android/基本

#[環境]
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」にチェックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/46d91c85-a1aa-b4e1-a12e-5ef6a132fd48.png)

・AndroidにスイッチしバンドルIDを設定する。
<font color="Red">・com.ore.TestAndroidPlugin）　→ Javaでは重要なので意識してください。com.ore.TestAndroidPluginとなってる華胥ありますが私はここでつまづきました</font>
・MinimumAPILevelを設定する（例：Android4.4 APILevel19) デフォルト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/575655ee-2876-a0d6-09ce-dea4f10b2f92.png)

・Unityプロジェクトと同じフォルダにExport用フォルダを作成し、フォルダに移動してから「フォルダの選択」を押す（例：TestAndroidPlugin\Android）
　・AndroidStudio用プロジェクトが生成される

# AndroidStudioで読み込む
UnitySDKかAndroidStudioのSDKを使うか指定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/6e81f4a8-60c9-3128-d61f-f0dccc0801b2.png)

プロジェクト解析にすこし時間がかかります。
・ビルドエラーは出ず問題なく実行できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/41bdeb33-436a-b680-80dd-9cdd27425b21.png)

#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」を押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/fe9751ba-3191-53f6-5318-da5cd3e09017.png)

　・「Application/Library name」を設定する（例：UnityPlugin）
　・「Package name」を右側の「edit」を押し、設定し、「done」を押す（例：com.ore.unityplugin）
　・「MinimumSDK」をUnityに設定したものと同じか、小さいものに設定する（例：API23)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/f54e33ba-7809-666f-d39e-8e70a4a6f687.png)

　・「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」を押す
・以下はトースト表示する簡単なサンプル


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/f7f3922a-fd3d-21f3-928f-e362d841562f.png)

```
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]を押すとビルド成功します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/e7a36ac5-3ee9-fd29-d77d-c8af1d0cecfa.png)
<font color="Red">　・aarのサイズは16K程度です。100kくらいある場合はunity-classes.jarも含んでおり、プラグイン利用時にUnityが持つJarと衝突します。</font>

# 作成したPluginを使う

UnityProject/Asset/Plugins/Androidに作成したプラグイン *.aar を配置する。

#スクリプト

TestPlugin を作成して適当なGameObjectに配置する。UnityでButtonとTextを生成してTestPlugin と接続する。
最後に<font color="Red">Android実機</font>で動作確認をする。

```

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

```