UnityのSceneをAndroidのSubView(FrameLayout)として埋め込むまで

#はじめに
**この記事ではAndroid Studio3.2, Unity 2018.2.17でビルドしたものを扱っています.**
UnityはマルチプラットフォームですがAndroidに関してはデフォルトでActivityクラスしか吐き出しません.
多くの記事ではActivityクラスをそのまま扱っているようのなので, 既存のActivityクラスで3Dモデルを表示したい人などこの記事を参考にしてくれると嬉しいです.
 
#Unityプロジェクト → Androidプロジェクト
・File → Build Setting
・Androidで扱いたいSceneを追加し, PlatformでAndroidを指定
・Texture Compressusinを ETC2(GLES 3.0)に変更
・Build Systemを Gradle に変更
・Export Project にチェック
・Player Settingsより Other Settings→IdentificationをビルドしたいAndroidの環境に応じて修正
![スクリーンショット 2018-11-28 15.10.19.png](https://qiita-image-store.s3.amazonaws.com/0/55566/8d6ad26f-1508-8c3a-e782-1ec3744b646a.png)
・Build SettingsよりAndroid ProjectとしてExport
#Androidプロジェクト → AARファイル
先ほど生成したUnityのAndroidProjectを開き,
AndroidManifestより,intent-filterの部分をコメントアウトします.

```AndroidManifest.xml
<!--<intent-filter>-->
 <!--<action android:name="android.intent.action.MAIN" />-->
 <!--<category android:name="android.intent.category.LAUNCHER" />-->
 <!--<category android:name="android.intent.category.LEANBACK_LAUNCHER" />-->
<!--</intent-filter>-->
```

build.gradleより,以下を修正します.

```build.gradle 
apply plugin: 'com.android.application'
→apply plugin: 'com.android.library'

applicationId 'com.project.unitytest'
→//applicationId 'com.project.unitytest'   
```
buildを行い,完了したら, PROJECT_FOLDER\build\outputs\aar\にAARファイルが出力されています.

実装予定のAndroid プロジェクトファイルを開き,
 File &rarr; New &rarr; New Module &rarr; Import .JAR/.AAR Package
より先ほど生成したAARファイルを指定します.

settings.gradleとbuild.gradle(app)に下記を追記し,

```settings.gradle
include ':app', ':unitytest-debug'
```
```app:build.gradle
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation project(":unitytest-debug")
}
```

この段階で,gradleがsyncできるか試してみてください.
できない場合は,AndroidManifestから,
manifestタグに, xmlns:tools="http://schemas.android.com/tools" ,
applicationタグに, tools:replace="android:icon,android:theme",
を追加し,念のため, android:iconをコメントアウトしてみてください.

#UnityのSceneをSubView(FrameLayout)として実装
UnityPlayerActivityではなく普通のActivityを継承します.
AndroidにExportする段階で,指定したDefaultのSceneが表示されます.

```MyActivity.java
import com.unity3d.player.UnityPlayer;
public class MyActivity extends Activity {
    private UnityPlayer unityPlayer;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // unity playerのインスタンスを生成,初期化
        unityPlayer = new UnityPlayer(this);
        int glesMode = unityPlayer.getSettings().getInt("gles_mode", 1);
        boolean trueColor8888 = false;
        unityPlayer.init(glesMode, trueColor8888);
        setContentView(R.layout.myactivity);
        // 指定のFrameLayoutにUnityViewを追加
        FrameLayout layout = (FrameLayout) findViewById(R.id.unity_fragment);    
        LayoutParams lp = new LayoutParams (LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
        layout.addView(unityPlayer.getView(), 0, lp);
        // UnityPlayerにフォーカスを合わせる
        unityPlayer.windowFocusChanged(true);
        unityPlayer.resume();
    }
}
```
#最後に
ここ数年,Androidでのアニメーション処理はBitmapを切り貼りして実装してきたのですが,
いろいろきつくなってきたので, Unityに移行することにしました.
めちゃくちゃ便利ですね.
#参考文献
- [Embedded Unity within Android App](https://medium.com/@davidbeloosesky/embedded-unity-within-android-app-7061f4f473a)
- [Using Unity Android In a Sub View](https://forum.unity.com/threads/using-unity-android-in-a-sub-view.98315/)
- [Errors managing the UnityPlayer lifecycle in a native android application](https://stackoverflow.com/questions/23467994/errors-managing-the-unityplayer-lifecycle-in-a-native-android-application)