Unity Android Plugin の手間を軽減する管理方法(改)
概要
Unity Android Plugin の解説記事では JAR, AAR ファイルを手動コピーする例が多く見受けられます。 手動コピーでは依存ライブラリのバージョンを管理しづらくなるため、出来る限り手動コピーは避けたいです。 この記事では Gradle の Local リポジトリを経由して Android Plugin を Unity に公開する方法を説明します。
目次
確認環境
- macOS 10.15.7
- Android
- Android Studio 4.1.2
- minSdkVersion 19
- buildToolsVersion 30.0.3
- Gradle 6.5
- Unity 2019.4.18f1
- Rider 2020.3.2
参考情報
- Unity Androidプラグインの手間を軽減する管理方法. Android ライブラリを… | by Mitsuhiro Koga | Kadinche Engineering | Medium
- Maven Publish プラグインを使用する | Android デベロッパー | Android Developers
- 【成果発表会】「”ゲーム+何か”が求められる時代に挑戦」Unityネイティブプラグインで困った話(Android編) | ⬢ Appirits spirits
- 実行中の Activity を取得する
解説
Android Plugin (AAR) をビルドする
Android Library モジュールを作成し、モジュールの build.gradle を以下の様に記述します。 この例ではモジュール名を sample にしています。
plugins { id 'com.android.library' id 'kotlin-android' id 'maven-publish' } ext { groupId = "com.example" versionName = "1.0" unityVersion = "2019.4.18f1" unityJar = "/Applications/Unity/Hub/Editor/$unityVersion/PlaybackEngines/AndroidPlayer/Variations/mono/Release/Classes/classes.jar" } group = groupId version = versionName android { compileSdkVersion 30 buildToolsVersion "30.0.3" defaultConfig { minSdkVersion 19 targetSdkVersion 30 versionCode 1 versionName versionName testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles "consumer-rules.pro" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = '1.8' } } dependencies { compileOnly files(unityJar) implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" implementation 'androidx.core:core-ktx:1.3.2' implementation 'androidx.appcompat:appcompat:1.2.0' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.2' androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' } // see: https://developer.android.com/studio/build/maven-publish-plugin?hl=ja afterEvaluate { publishing { publications { release(MavenPublication) { from components.release } debug(MavenPublication) { from components.debug artifactId = "${project.name}-debug" } } } }
ポイントは以下の2点です。
- Maven Publish Plugin を使用する
- Unity の classes.jar をコピーせずに直接指定する
1つめのポイントとして、
Maven Publish Plugin を使用するために plugins
に id 'maven-publish'
を追加しています。
また、afterEvaluate
内に publishing
の設定を記述しています。
この例の設定では、ビルドバリアント(debug, release)毎に AAR ファイルを生成します。
具体的には、sample-1.0.aar (release) ファイルと sample-debug-1.0.aar (debug) ファイルが生成されます。
2つめのポイントとして、
compileOnly files(unityJar)
によって Unity の classes.jar を参照しています。
Windows の場合は unityJar のパスを適切なパスに変更してください。
Unity のバージョンを変える場合には unityVersion を変更します。
implementation ではなく compileOnly にしている理由は、
Unity から AAR ファイルを参照する際に Unity の classes.jar が重複して参照されることを防ぐためです。
implementation にすると Unity でビルドする際にエラーになります。
ビルド設定は以上です。
ビルドを実行する前に、今回は以下のサンプルプログラムを作成します。
package com.example.unity.sample import com.unity3d.player.UnityPlayer class KotlinObject { fun getActivityName(): String = UnityPlayer.currentActivity.localClassName }
Android Plugin をビルドし、Local リポジトリに保存する
以下のコマンドを Terminal で実行するとビルドが行われ、その結果が Local リポジトリに保存されます。
project % ./gradlew publishToMavenLocal
Gradle のデフォルトでは、Local リポジトリは ~/.m2/repository
になっています。
この repository ディレクトリに以下のファイルといくつかの関連ファイルが作成されます。
- com/example/sample/1.0/sample-1.0.aar
- com/example/sample-debug/1.0/sample-debug-1.0.aar
以上で Android Plugin の作成と公開は終了です。
アプリに Android Plugin への依存を追加する
Unity で Project Settings > Player > Android > Publishing Settings > Build と辿っていくと以下の設定が表示されます。
画像の様に以下の2箇所にチェックを付けます。
- Custom Main Gradle Template
- Custom Base Gradle Template
チェックを付けることで Assets/Plugins/Android ディレクトリに以下の2つのファイルが作成されるはずです。 (作成されない場合は Build を実行してみると作成されると思います。)
- mainTemplate.gradle
- baseProjectTemplate.gradle
この2つのファイルを編集します。
// GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN apply plugin: 'com.android.library' **APPLY_PLUGINS** dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.example:sample:1.0' **DEPS**} // ... 以下省略
// ... 以上省略 repositories {**ARTIFACTORYREPOSITORY** google() jcenter() mavenLocal() flatDir { dirs "${project(':unityLibrary').projectDir}/libs" } } } task clean(type: Delete) { delete rootProject.buildDir }
mainTemplate.gradle には implementation 'com.example:sample:1.0'
を追加しています。
これは groupId:artifactId:version
の形式になっており、groupId と version は Android Plugin の build.gradle で指定した値になっています。
artifactId はモジュール名が使われており、今回は sample (release) か sample-debug (debug) です。
baseProjectTemplate.gradle には mavenLocal()
を repositories
に追加しています。
ファイル内に repositories が2箇所あるので注意して下さい。
buildscript 内の repositories はビルドスクリプト(Gradle)が使用するライブラリのリポジトリを指定しています。
buildscript ではない方の repositories は Android アプリをビルドする際に使用するライブラリのリポジトリ指定です。
ここに Local リポジトリを参照する指定 mavenLocal()
を追加します。
アプリをビルドする
今回は以下の Script を作成して動作確認をしました。
using UnityEngine; using UnityEngine.UI; public class AndroidExecutor : MonoBehaviour { [SerializeField] private Text result; void Start() { using (var o = new AndroidJavaObject("com.example.unity.sample.KotlinObject")) { result.text = o.Call<string>("getActivityName"); } } }
Android デバイスを PC に接続するか Android Emulator を起動した上で、 Build Settings で Android Platform に Switch して、 Run Device にデバイスか Emulator を指定します。 File メニューの Build And Run を選択すると APK ファイルのファイル名を訊ねられないので、 Build Settings の Build And Run は使わずに閉じて File メニューから実行しています。
実行するとText に以下の様に表示されます。