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のドキュメントを参照