なごるふ

UnityとかArduinoとか気になったことを

【Unity】Javaファイルを配置してAndroidプラグインとして利用する

JAR形式ではなく、java形式のAndroid Javaプログラムを直接Unityプロジェクトに追加して、Androidプラグインとして利用する方法の備忘録です。

Unityマニュアル

Java や Kotlin のソースファイルをプラグインとして使用 - Unity マニュアル

JavaファイルのプラグインサポートはUnity2018.2から追加されています。

プラグイン配置

プロジェクトのAssetsフォルダ以下の任意の場所に、Plugins/Androidフォルダを作成して、Javaファイルを配置します。

C#からJavaの呼び出し

using UnityEngine;

public class TestBehaviour : MonoBehaviour
{
    void Start()
    {
        AndroidJavaObject android = new AndroidJavaObject("unity.android.plugin.AndroidPlugin");
        android.Call("receiveUnity");
    }
}
package unity.android.plugin;

import com.unity3d.player.UnityPlayer;

public class AndroidPlugin
{
    public void receiveUnity()
    {
        // ここが呼ばれる
    }
}

JavaからC#の呼び出し

JavaからUnity側の呼び出しは、シーンに配置されているオブジェクトにアタッチされたMonoBehaviourの関数に限定されます。

以下のコード例ではシーン上にReceiverという名前のGameObjectがあり、TestBehaviourがアタッチされた状態の時にPluginMessageが呼ばれます。

using UnityEngine;

public class TestBehaviour : MonoBehaviour
{
    public void PluginMessage(string message)
    {
    }
}
package unity.android.plugin;

import com.unity3d.player.UnityPlayer;

public class AndroidPlugin
{
    public void sendUnity()
    {
        // Object名、関数名、メッセージ.
        UnityPlayer.UnitySendMessage("Receiver", "PluginMessage", "message");
    }
}

Unity側に送れる情報は1つまでなので、複数の情報を送りたい場合はJson形式やカンマ区切りなどで1つの文字列にまとめて送る感じになります。

パーミッション追加

利用する機能によって権限の要求が必要な場合には、AndroidManifestをプロジェクトに追加します。

AndroidManifestの配置はプラグインの配置と異なり、Assets/Plugins/Androidフォルダ以下に限定されているようです。

{Unityをインストールしたフォルダ}/PlaybackEngines/AndroidPlayer/Apk以下にあるUnityManifest.xmlの内容をベースに、Assets/Plugins/Android以下にAndroidManifest.xmlを新規で作成します。

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.unity3d.player"
    xmlns:tools="http://schemas.android.com/tools">
    <application>
        <activity android:name="com.unity3d.player.UnityPlayerActivity"
                  android:theme="@style/UnityThemeSelector">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
        </activity>
    </application>

<!-- 以下にパーミッションを追加 -->

</manifest>