UnityからGradleプロジェクトをエクスポートする。
- File → Build Settings
- PlatformでAndroidを選択してSwitch Platform
- Export Projectにチェックを入れる
プロジェクトをAndroidStudioで開く。Don't remind me again for this project.
ここで一旦、このままでapkをビルドできることを確認しておくとよいでしょう。apkをビルドするにはこのプロジェクトフォルダをAndroid Studioで開いて実行ボタンを押すだけです。apkがビルドされてUSB接続されたAndroid端末で実行されればOK。

コマンドでビルドするには、エクスポートされたプロジェクトでgradle assembleReleaseを実行すれば良いです。
GradleプロジェクトをAndroidライブラリ用に書き換える
UnityからエクスポートされたプロジェクトはAndroidアプリケーション(apk)をビルドするための設定になっているので、これをAndroidライブラリ(aar)をビルドするための設定に書き換えます。
まず、build.gradleを開いて、apply plugin: 'com.android.application'をapply plugin: 'com.android.library'に書き換え、applicationIdの指定を削除します。
// apply plugin: 'com.android.application'
apply plugin: 'com.android.library'
...
android {
...
defaultConfig {
...
// applicationId 'com.example.myapp'
}
}
それから、src/main/AndroidManifest.xmlを開き、<activity>の中に指定されている<intent-filter>のブロックをまるごと削除します(これをしないとUnityのActivityを直接起動するアイコンがランチャーに表示されてしまう)。
そして、このディレクトリでgradle assembleReleaseを実行すると、build/outputs/aarの中にaarファイルができています。
※Android Studioでビルドする場合は、右上の方にあるGradleタブからTasks/build/assembleReleaseを探してダブルクリックします。

※ビルド時になんかエラーが出る場合は、gradle cleanしてからgradle assembleReleaseしてみると、改善する場合があります。gradle clean assembleReleaseと繋げて書いても良いです。
アプリケーションプロジェクトに取り込む
aarができたので、次はこれを利用する側のアプリケーションプロジェクトを作ります。
Android Studioで普通にAndroidプロジェクトを作ったら、File→New→New Module...→Import .JAR/.AAR Packageと選択します。
- File name: 欄に先程作ったaarファイルを選択
- Subproject name: 必要に応じて書き換える
Gradleビルドが始まるので少し待ちます…
app/build.gradleを開き、dependenciesブロックの中にimplementation project(':xxx')を追加します。xxx部分は先程指定したSubproject nameが入ります。
これでビルドすると、AndroidManifest.xmlのマージに失敗するエラーが出ると思うのでエラーを解消します。
app/src/main/AndroidManifest.xmlを開き、
-
<manifest>にxmlns:tools="http://schemas.android.com/tools"を追加します -
<application>にtools:replace="theme, icon"を追加します
こんな感じになります。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.myapp">
<application
tools:replace="theme, icon"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
ここまでできたらapkがビルドできるようになっているはずです。
アプリからUnityを呼び出す
AndroidアプリからUnityを起動したいところで、UnityPlayerActivityを呼び出すだけです。
Intent intent = new Intent(context, UnityPlayerActivity.class);
startActivity(intent);
Unityからアプリに戻ってくる
ここまでの方法でUnityを起動することはできますが、Unityから戻ってくることができません。理由はUnityのActivityが終了時に自身のプロセスを終了するようになっているため、呼び出し元のActivityのプロセスも一緒に巻き添えになって死んでしまうからです。
これを回避するためには、UnityのActivityと呼び出し元のアプリのActivityを別のプロセスで実行する必要があります。Activityを実行するプロセスを分けるためには、AndroidManifest.xmlに以下のようにandroid:process=":プロセス名"指定をします。プロセス名は何でも良いです。
<activity
android:name=".MainActivity"
android:process=":main">
詳細はAndroidのドキュメントを参照