#はじめに
この記事では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の環境に応じて修正
・Build SettingsよりAndroid ProjectとしてExport
#Androidプロジェクト → AARファイル
先ほど生成したUnityのAndroidProjectを開き,
AndroidManifestより,intent-filterの部分をコメントアウトします.
<!--<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より,以下を修正します.
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 → New → New Module → Import .JAR/.AAR Package
より先ほど生成したAARファイルを指定します.
settings.gradleとbuild.gradle(app)に下記を追記し,
include ':app', ':unitytest-debug'
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が表示されます.
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に移行することにしました.
めちゃくちゃ便利ですね.
#参考文献