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


概要

Unity単体では使う事の出来ないAndroidの機能もAndroidプラグインを呼び出すことで使えるようになります。
この記事は、導入するための最小限のポイントをまとめたものです。詳しい解説は他の方の記事を参考にしてください(この記事の一番下にもリンクを貼っています)
この記事はAndroidStudio4.0.1を使用しています。

1) プロジェクト作成

AndroidStudioを起動してFile > New > New Projectと進みます

テンプレート選択画面ではNo Activity > Nextと進みます

Nameに適当な名前を入力してください(Package nameは自動入力されます)LanguageはJavaを選びます

2) モジュール作成

File > New > New Moduleと進みます(New Moduleが押せない時はパソコンが処理してる最中なのでしばらく待ってみてください)

Android Library > Nextと進みます

設定を確認してFinishを押します

3) appモジュールはいらないので削除します

File > Project Structure

1)Modulesを選ぶと右の画面が切り替わります。
2)appが選択されているのを確認して『-』ボタンを押すとappの消去が決定されます
3)最後にOKを押します(OKを押さずにウィンドウを閉じると消去されないので注意してください)

4) Unityクラスライブラリを追加

Unityのプログラムフォルダ内にあるUnityクラスライブラリを貰ってきます
スクリーンショットの様にProjectを選び

libsを表示しておきます

環境によって違いますがUnityのプログラムフォルダをたどった先にあるclasses.jarを先ほどのlibsフォルダへコピーします(ドラッグアンドドロップするとファイルの移動になってしまいます。一度別のフォルダにコピーしてからそのファイルをlibsへドラッグアンドドロップすると上手くいきます)

5) モジュールレベルのbuild.gradleを修正する

スクリーンショットの様にフォルダをたどりbuild.gradleをダブルクリックすると右の方にコードが表示されます。

コードを下にスクロールして

    implementation fileTree(dir: "libs", include: ["*.jar"])

この一行を

    compileOnly fileTree(dir: "libs", include: ["*.jar"])

と書き換えます。修正が終わったら右上のSync Nowを押します。成功するとSUCCESSFULと表示されるはずです。

6) プラグイン用のコードを作成する

スクリーンショットの様にAndroidを選択します

スクリーンショットの丸印のフォルダ上で右クリック > New > Java Class

ポップアップが表示されるのでクラス名を入力します

プラグインのコードを入力します
Unity側から呼ばれるメソッドがFromUnity()で、このメソッドからUnity側のFromAndroid()を呼ぶことになります

package com.example.mylibrary;

import com.unity3d.player.UnityPlayer;

public class PluginTest {
    public static String FromUnity()
    {
        UnityPlayer.UnitySendMessage("UnityTest" , "FromAndroid" , "メソッド呼び出し");
        return( "戻り値" );
    }
}

Build > Make Module

プラグインが出力されたのでフォルダをたどって表示しておきます。

Unityでフォルダを作ります。
Assets > Plugins > Android
作成したフォルダに先ほどの出力されたプラグインをドラッグアンドドロップします。

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

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してください

AndroidのスマフォをパソコンにUSB接続してBuild And Runします(うまく出来ない時はスマフォ側の設定を変更する必要があるかもしれません)

スマフォ画面で実行結果を確認します。ボタンを押すたびに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のメソッド名」
第三引数 呼び出したメソッドに渡す引数

UnityPlayer.UnitySendMessage("UnityTest" , "FromAndroid" , "メソッド呼び出し");

Unity側のAndroidJavaClassの引数は
Java側のコードのpackageに指定されている部分 + クラス名
で記述します

AndroidJavaClass("com.example.mylibrary.PluginTest")