[Unity]Androidネイティブプラグイン(Java言語)

#概要
Unity単体では使う事の出来ないAndroidの機能もAndroidプラグインを呼び出すことで使えるようになります。
この記事は、導入するための最小限のポイントをまとめたものです。詳しい解説は他の方の記事を参考にしてください(この記事の一番下にもリンクを貼っています)
この記事はAndroidStudio4.0.1を使用しています。
#1) プロジェクト作成
AndroidStudioを起動してFile > New > New Projectと進みます
![スクリーンショット (2219).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/2c88d222-1dea-a854-f4bf-dc66ab89c190.png)
テンプレート選択画面ではNo Activity > Nextと進みます
![スクリーンショット (2220).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/52fa4a1c-8887-faa0-6b9a-652780abc204.png)
Nameに適当な名前を入力してください(Package nameは自動入力されます)LanguageはJavaを選びます
![スクリーンショット (2221).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/02d091ba-fb0c-03d6-e506-d447dad7d2d6.png)
#2) モジュール作成
File > New > New Moduleと進みます(New Moduleが押せない時はパソコンが処理してる最中なのでしばらく待ってみてください)
![スクリーンショット (2222).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/099de9e0-c8f7-39e5-b5b8-9d7d071516ba.png)
Android Library > Nextと進みます
![スクリーンショット (2223).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/8271924d-2b03-14d8-1f48-35a0636c851f.png)
設定を確認してFinishを押します
![スクリーンショット (2224).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/0311e772-8cdd-13a1-b0d7-b0d6886be502.png)
#3) appモジュールはいらないので削除します
File > Project Structure
![スクリーンショット (2226).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/c32f3c46-c294-9dc8-c897-a6e56080432c.png)
1)Modulesを選ぶと右の画面が切り替わります。
2)appが選択されているのを確認して『-』ボタンを押すとappの消去が決定されます
3)最後にOKを押します(OKを押さずにウィンドウを閉じると消去されないので注意してください)
![スクリーンショット (2227).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/52695221-ec85-35b9-aeed-24a8354439a8.png)
#4) Unityクラスライブラリを追加
Unityのプログラムフォルダ内にあるUnityクラスライブラリを貰ってきます
スクリーンショットの様にProjectを選び
![スクリーンショット (2231).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/b70f6815-fb9a-99f1-3f8a-a54036d24a94.png)
libsを表示しておきます
![スクリーンショット (2232).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/fd73c46d-4fbe-cf3b-897e-f77d309fddc2.png)
環境によって違いますがUnityのプログラムフォルダをたどった先にあるclasses.jarを先ほどのlibsフォルダへコピーします(ドラッグアンドドロップするとファイルの移動になってしまいます。一度別のフォルダにコピーしてからそのファイルをlibsへドラッグアンドドロップすると上手くいきます)
![スクリーンショット (2228).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/f11e343f-622d-85c1-43e3-4e0fa2d86a16.png)
#5) モジュールレベルのbuild.gradleを修正する
スクリーンショットの様にフォルダをたどりbuild.gradleをダブルクリックすると右の方にコードが表示されます。
![スクリーンショット (2233).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/46475183-60fa-c4c8-06dd-60324fb7737e.png)
コードを下にスクロールして

```java
    implementation fileTree(dir: "libs", include: ["*.jar"])
```
この一行を

```java
    compileOnly fileTree(dir: "libs", include: ["*.jar"])
```
と書き換えます。修正が終わったら右上のSync Nowを押します。成功するとSUCCESSFULと表示されるはずです。
![スクリーンショット (2234).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/e2d25c79-55f5-bb7b-5bac-a6ad3b494f26.png)
#6) プラグイン用のコードを作成する
スクリーンショットの様にAndroidを選択します
![スクリーンショット (2235).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/7dd8da18-1510-ac8d-0cc7-8225fc145fc2.png)
スクリーンショットの丸印のフォルダ上で右クリック > New > Java Class
![スクリーンショット (2236).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/f5d319b5-eeab-4646-6e9c-4af4ad068542.png)
ポップアップが表示されるのでクラス名を入力します
![スクリーンショット (2237).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/fd21d1c0-2d8a-bad3-14f6-0dd36efa5c1a.png)
プラグインのコードを入力します
Unity側から呼ばれるメソッドがFromUnity()で、このメソッドからUnity側のFromAndroid()を呼ぶことになります

```java
package com.example.mylibrary;

import com.unity3d.player.UnityPlayer;

public class PluginTest {
    public static String FromUnity()
    {
        UnityPlayer.UnitySendMessage("UnityTest" , "FromAndroid" , "メソッド呼び出し");
        return( "戻り値" );
    }
}
```
Build > Make Module
![スクリーンショット (2239).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/9dc64048-d82e-3e9b-8e2a-88dbf9a0e4ca.png)
プラグインが出力されたのでフォルダをたどって表示しておきます。
![スクリーンショット (2240).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/e959f1b9-8e1f-42a8-8c31-2e2acde319d4.png)
Unityでフォルダを作ります。
Assets > Plugins > Android
作成したフォルダに先ほどの出力されたプラグインをドラッグアンドドロップします。
![スクリーンショット (2241).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/58a93bc8-4999-3d74-dcd6-1a7a32bd1802.png)

UnityTest.csを新規作成してコードを記述します。

```c#
using UnityEngine;
using UnityEngine.UI;

public class UnityTest : MonoBehaviour {
    [SerializeField] Text txtMessage;
    [SerializeField] Button btnAndroid;

    void Start() {
        btnAndroid.onClick.AddListener(CallAndroidPlugin);
        txtMessage.text = "初期値";
    }

    /// <summary>
    /// ボタンが押されたらプラグインを呼ぶ
    /// </summary>
    public void CallAndroidPlugin() {
        using (AndroidJavaClass androidJavaClass = new AndroidJavaClass("com.example.mylibrary.PluginTest")) {
            txtMessage.text += androidJavaClass.CallStatic<string>("FromUnity");
        }
    }

    /// <summary>
    /// プラグイン側からUnityを呼ぶ
    /// </summary>
    public void FromAndroid(string str) {
        txtMessage.text += str;
    }
}
```

uGUIでテキストとボタンを用意します
空のオブジェクトを作って先ほど作ったUnityTestをAddComponentしてください
![スクリーンショット (2242).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/e21fbc64-3a5f-60f0-0ba2-4b550d1fba64.png)

AndroidのスマフォをパソコンにUSB接続してBuild And Runします(うまく出来ない時はスマフォ側の設定を変更する必要があるかもしれません)
![スクリーンショット (2243).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/9d11ba96-3556-cdf2-0e72-070fc6947ba4.png)
スマフォ画面で実行結果を確認します。ボタンを押すたびにAndroidプラグインを介して処理が行われることが確認できます。(ボタンを押すたびにテキスト文字が増え続けます)

#参考にさせていただいた記事
こちらの記事の方が詳しくわかりやすく書かれています。自分のつまずいた箇所とバージョンの差による表示の違いをまとめるために今回記事にしてみました。
Unity向けAndroidネイティブプラグインの作り方
https://gaprot.jp/2020/03/30/unity-android-native-plugin/
【Unity】Android Nativeプラグイン開発 最小構成でなるべくわかりやすくまとめた
https://ghoul-life.hatenablog.com/entry/2019/01/26/030622

#追記
プラグイン側のUnitySendMessageの引数は
第一引数　プラグイン側から呼び出したい「Unityのクラス名」
第二引数　プラグイン側から呼び出したい「Unityのメソッド名」
第三引数　呼び出したメソッドに渡す引数

```java
UnityPlayer.UnitySendMessage("UnityTest" , "FromAndroid" , "メソッド呼び出し");
```
Unity側のAndroidJavaClassの引数は
Java側のコードのpackageに指定されている部分 + クラス名
で記述します

```c#
AndroidJavaClass("com.example.mylibrary.PluginTest")
```