🎃

【Unity/Android】UaaL(Unity as a Library)のサンプルプロジェクトを起動する

2023/09/01に公開

恋愛メタバース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が再生される🎉

参考

https://qiita.com/izuki_y/items/3c20cd1c655fc4fc6127
https://developer.android.com/studio/projects/install-ndk?hl=ja

Flamers Tech Blog

Discussion