UnityをAndroidアプリの中に埋め込む

## 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。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/56668/0c815f53-420d-3fbb-089f-4ddb2ba5774c.png)

コマンドでビルドするには、エクスポートされたプロジェクトで`gradle assembleRelease`を実行すれば良いです。


## GradleプロジェクトをAndroidライブラリ用に書き換える

UnityからエクスポートされたプロジェクトはAndroidアプリケーション(apk)をビルドするための設定になっているので、これをAndroidライブラリ(aar)をビルドするための設定に書き換えます。

まず、`build.gradle`を開いて、`apply plugin: 'com.android.application'`を`apply plugin: 'com.android.library'`に書き換え、`applicationId`の指定を削除します。

```build.gradle
// 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を探してダブルクリックします。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/56668/64284faf-8d5b-82e1-b18b-ef4c1c61ca64.png)

※ビルド時になんかエラーが出る場合は、`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
<?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`を呼び出すだけです。

```java
Intent intent = new Intent(context, UnityPlayerActivity.class);
startActivity(intent);
```

## Unityからアプリに戻ってくる

ここまでの方法でUnityを起動することはできますが、Unityから戻ってくることができません。理由は**UnityのActivityが終了時に自身のプロセスを終了するようになっているため、呼び出し元のActivityのプロセスも一緒に巻き添えになって死んでしまう**からです。

これを回避するためには、UnityのActivityと呼び出し元のアプリのActivityを別のプロセスで実行する必要があります。Activityを実行するプロセスを分けるためには、AndroidManifest.xmlに以下のように`android:process=":プロセス名"`指定をします。プロセス名は何でも良いです。

```xml
<activity
  android:name=".MainActivity"
  android:process=":main">
```

詳細は[Androidのドキュメント](https://developer.android.com/guide/topics/manifest/activity-element#proc)を参照