Android用Plugin(java[aar])の作成

※この記事は2017年05月30日にqiitaに投稿した内容です。

環境

Unity5.6.1f1 AndroidStudio2.3.2

AndroidStudio用プロジェクトの作成

・Unityを起動し、プロジェクトを作成する(例:TestAndroidPlugin) ・Androidにスイッチし、バンドルIDを設定する(例:com.example.testandroidplugin) ・MinimumAPILevelを設定する(例:Android4.1 APILevel16) ・BuildSettingを開き、「Build System」をGradle(New)に変更する ・「ExportProject」、「DevelopmentBuild」にチェックし、「Export」を押す ・Unityプロジェクトと同じフォルダにExport用フォルダを作成し、フォルダに移動してから「フォルダの選択」を押す(例:TestAndroidPlugin\Android)  ・AndroidStudio用プロジェクトが生成される

AndroidStudioで読み込む

・AndroidStudioを開く ・「Import Project(EclipseADT,Gradle,etc) 」を押し、AndroidStudio用プロジェクトを生成したフォルダを開き、「build.gradle」を選択し、「OK」を押す ・「Gradle settings for this project are not configured yet.」ダイアログが出るので「OK」を押す ・プロジェクトが読み込まれる ・この時点で以下のエラーが出ている Error:org.gradle.api.internal.tasks.DefaultTaskInputs$TaskInputUnionFileCollection cannot be cast to org.gradle.api.internal.file.collections.DefaultConfigurableFileCollection Possible causes for this unexpected error include: ・左上の縦に並んでいる「Project」をクリックし、プロジェクトのツリーが見えるようにする ・「GradleScript」からbuild.gradleを選択し、開く ・上部に記載されている以下の部分をcom.android.tools.build:gradle:2.3.2に変更する  2.3.2はAndroidStudioのバージョン名 自分の環境で変更する(タイトルに表示されている)

    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.0'
    }

・右上に出ている「TryAgain」を押す  ・エラーが消える

※この項目の以下の作業はAndroidStudio上でアプリケーションのビルドを行わない場合(プラグインのビルドの事ではない)は要らない。つまり今回は要らない ・プロジェクトツリーから一番上のプロジェクト名(例:TestAndroidPlugin)を選択し、右クリックし、「OpenModuleSetting」を押す ・「Flavors」タブを選択し、MinSdkVersionをUnityに設定したものと同じに設定する(例:API16)  ・選択にない場合はメニューの「Tool」>「Android」>「SdkManaager」からインストールする ・「OK」を押す

プラグインモジュールの追加

・メニューの「File」>「New」>「NewModule」を押す  ・「AndroidLibrary」を選択し、「Next」を押す  ・「Application/Library name」を設定する(例:UnityPlugin)  ・「Package name」を右側の「edit」を押し、設定し、「done」を押す(例:com.example.unityplugin)  ・「MinimumSDK」をUnityに設定したものと同じか、小さいものに設定する(例:API16)  ・「Finish」を押す   ・モジュールが生成され、プロジェクトツリーのルートの2番目にモジュールのツリーが追加される   ・この時点でエラーが5つほど表示される ・プロジェクトツリーの「GradleScript」>「build.gradle(Module:プライグイン名)」(2番目)を選択し、開く  ・「apply plugin: 'com.android.library'」の行の下に以下を追加する

repositories {
    maven { url 'http://repo1.maven.org/maven2' }
}

 ・右上に出ている「TryAgain」を押す   ・エラーが消える  ・「dependencies」{}内の最後に以下を追加する

compile files('../libs/unity-classes.jar')

 ・ファイルの最後に以下を追加する   ・OUTPUT_NAMEは任意の名前に変更する

android.libraryVariants.all { variant ->
    variant.outputs.each { output ->
        output.packageLibrary.exclude('libs/unity-classes.jar')
    }
}

def OUTPUT_NAME='testplugin.aar'
task exportAar(type: Copy) {
    from('build/outputs/aar/')
    into('../../../Assets/Plugins/Android/')
    include('unityplugin-release.aar')
    rename('unityplugin-release.aar', OUTPUT_NAME)
}
exportAar.dependsOn(build)

 ・右上に出ている「SyncNow」を押す

プラグインjavaクラスの追加

・プロジェクトツリーから「プラグイン名」>「Java」>「パッケージ名」を選択(例:unityplugin>Java>com.example.unityplugin)  ・(AndroidTest)や(Test)と書かれていないもの(一番上) ・メニューの「File」>「New」>「JavaClass」を押す ・「Name」を設定(例:TestPlugin) ・「OK」を押す ・以下はトースト表示する簡単なサンプル

package com.example.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();
            }
        });
    }
}

プラグインのビルド

・プロジェクトツリーから「プラグイン名」を選択(例:unityplugin) ・メニューの「Build」「Select Build Variant」を押す  ・「debug」を「Release」に変更 ・右上の縦に並んでいる「Gradle」をクリックし、開く ・「Plugin名」>「Other」>「exportAar」をダブルクリック  ・ビルドが実行され、Unityプロジェクトの「Assets/Plugins/Android/」に生成される  ・aarのサイズは16K程度

プラグインのテストプログラム

using UnityEngine;
using UnityEngine.UI;
using System.Collections;

public class TestPlugin : MonoBehaviour
{
    [SerializeField] private Button _button = null;

    private void Start()
    {
        _button.onClick.AddListener( () => OnButtonClick( _button ) );
    }

    private void OnButtonClick( Button button )
    {
        using (AndroidJavaClass javaClass = new AndroidJavaClass( "com.example.unityplugin.TestPlugin" ) )
        {
            Debug.Log( "OnButtonClick" );
            javaClass.CallStatic( "showToast", "Test" );
        }
    }
}