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