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

#環境
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」を押す
　　・モジュールが生成され、プロジェクトツリーのルートの２番目にモジュールのツリーが追加される
　　・この時点でエラーが５つほど表示される
・プロジェクトツリーの「GradleScript」>「build.gradle(Module:プライグイン名)」（２番目）を選択し、開く
　・「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」を押す
・以下はトースト表示する簡単なサンプル

~~~java
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程度

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

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