🎃
【Unity/Android】UaaL(Unity as a Library)のサンプルプロジェクトを起動する
恋愛メタバースMemoriaを開発するFlamers CTOの設楽(だーら)です。
今回はモバイルアプリ上でネイティブアプリと組み合わせてUnityを起動するUaaLについて、サンプルプロジェクトの起動を通して技術調査をいたしました。
はじめに
概要
- モバイルのネイティブアプリにUnityビルドを組み込む仕組みであるUnity as a Library(UaaL)のサンプルプロジェクトを起動する
- 今回はAndroid版のみをまとめる(別記事でiOSについても記述)
- Androidの方は、サンプルプロジェクトにもUnityのバージョンに応じて2種類のブランチがある。
- Android Studioでの作業は今回が初めてで、JavaやGradleのバージョンの違いによるエラーに苦しんだので、その点を特にまとめていきたい。
ゴール
- AndroidのSimulatorで下の画像のように、ネイティブアプリ上でUnityが動いている姿を見たい
環境
- Unity 2022.3.8f1と、2021.3.7f1(両方の環境で検証)
- Android Studio Giraffe | 2022.3.1 Patch 1
Unity 2022LTSの場合
- こちらは比較的容易に実現できた。
- 22LTS用のブランチが用意されているのでそちらに切り替える。記事執筆時点では、
2022.2.0a18 or later
が該当と記述されている。 - 基本的にはREADME通りに進める。
Unityでビルド
- Project Settingsで、
- Scripting BackendをIL2CPPに変更
- Target ArchitecturesでARMv7とARM64にチェックをいれる
- README通りのディレクトリに出力すると後で貼り付けるpathを変更する必要がないので楽
Android Studioで起動
- 起動直後にエラーは発生していない
- 上記のREADMEに従ってコピペ作業をする
- Syncをクリックすると、unityLibraryが追加されている。
- 上部バーの再生ボタンを押すとSimulatorが立ち上がる🎉
Unity 2021LTSの場合
- こちらで多くのエラーに遭遇した
- 19LTS-21LTS用のブランチに切り替える
Unityでビルド
- 22LTSと同様にProject Settingsで、
- Scripting BackendをIL2CPPに変更
- Target ArchitecturesでARMv7とARM64にチェックをいれる
Android Studioで起動
- 起動するとすぐエラーが発生している
Unable to make protected void java.net.URLClassLoader.addURL(java.net.URL) accessible: module java.base does not "opens java.net" to unnamed module @467aecef
GradleやJava等のバージョンを変更
バージョンの選定について
- Unityのドキュメントを見ると、2021.3はAndroid Gradle Plug-in: 6.1.1, Gradle: 4.0.1になっている。
- その状態でSyncすると以下のエラーが発生する
No version of NDK matched the requested version 21.0.6113669. Versions available locally: 25.2.9519653
- なお、21.0.6113669はインストールできない(少なくとも容易にはできない)
- Tools > SDK Managerで確認できる一覧に存在しない
- NativeAndroidApp/build.gradleでAndroid Gradle Plug-inバージョンを変更
allprojects {
buildscript {
dependencies {
- classpath 'com.android.tools.build:gradle:3.3.2'
+ classpath 'com.android.tools.build:gradle:4.2.2'
- NativeAndroidApp/gradle/wrapper/gradle-wrapper.propertiesでGradleのバージョンを変更
- distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip
+ distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-all.zip
- Javaのバージョンを13に変更(おそらくもともと17になっている)
- Settingsメニューから。
- Gradle 6.1.1に対応するJavaが8~13であるため。
- これでSyncは完了する
追記: Android Gradle Plug-inを7.4.2にアップデートする
- Upgrade Assinstantを起動しますか?をクリックした後
- アップデートをしてみたあとの画面
- アップデートのコードへの変更
- build.gradle(Project: NativeAndroidApp)
allprojects {
buildscript {
dependencies {
classpath 'com.android.tools.build:gradle:7.4.2'
- gradle-wrapper.properties
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip
- このまま再生して実行できた。
- Javaのバージョンを17に戻しても実行できた🎉
READMEに従い、Unityの情報を移す
- 基本はREADMEに従うだけ。
- gradle.propertiesをUnityのビルドからコピーするタイミングで、以下の1文はDepliatedらしいので削除する
android.enableR8=false
- ここまで来てもう一度Syncすると、階層にunityLibraryができる。
- この時点で再生するとIL2CPP / NDK関連のエラーがでる
エラーの詳細
- build.gradle(Module :unityLibrary)の
android.ndkDirectory
を、Unityが参照しているNDKに変更する(これが適切なソリューションなのかはわからない..)
- commandLineArgs.add("--tool-chain-path=" + android.ndkDirectory)
+ commandLineArgs.add("--tool-chain-path=" + "/Applications/Unity/Hub/Editor/2021.3.7f1/PlaybackEngines/AndroidPlayer/NDK")
- これで再度Syncし、再生するとSimulatorが再生される🎉
参考
恋愛メタバースMemoriaを運営するFlamers, Inc.のTech Blogです。 Unity / C# / VR系の記事を中心に投稿します。 常時積極採用中!wantedly.com/companies/flamers
Discussion