本項目目的是在移動端的 Native App 中以庫的形式集成已經寫好的 Unity 工程,利用 Unity 游戲引擎便捷的開發手段進行跨平臺開發。 ...
本項目目的是在移動端的 Native App 中以庫的形式集成已經寫好的 Unity 工程,利用 Unity 游戲引擎便捷的開發手段進行跨平臺開發。
Unity官方文檔 Unity as a Library integration example to iOS and Android
環境
- Android Studio
3.5.3
- Unity version
2019.3.7f1
新建工程操作步驟(安卓)
Step.1
- Android Studio 新建項目:
- Unity 新建項目:
- 最終工程結構如下:
Step.2
-
通過 Unity 打開 UnityProject
-
選擇 File -> Build Settings -> Switch Android Platform -> Export Project
-
這時候選擇Export可能會提示JDK路徑配置出錯,沒關係我們到 Preference -> Externl Tools 設置路徑
- 可以點擊Export了,路徑選擇可以自由選擇,這裡建議按照官方來
Step.3
-
通過 Android Studio 打開 NativeAndroidApp
-
選擇 setting.gradle 文件添加 unityLibrary module
include ':unityLibrary' project(':unityLibrary').projectDir = new File('..\\UnityProject\\androidBuild\\unityLibrary')
-
選擇 build.gradle(Module:app)添加 dependencies
dependencies { implementation project(':unityLibrary') implementation fileTree(dir: project(':unityLibrary').getProjectDir().toString() + ('\\libs'), include: ['*.jar']) // 自己項目的配置 }
-
選擇 build.gradle(Module:NativeAndroidApp)
allprojects { repositories { google() jcenter() // Add Code flatDir { dirs "${project(':unityLibrary').projectDir}/libs" } // End } }
-
選擇 NativeAndroidApp 的 strings.xml 添加
<resources> <string name="app_name">NativeAndroidApp</string> <string name="action_settings">Settings</string> // Add Code <string name="game_view_content_description">Game view</string> // End </resources>
解決方案事例
限制
- 以庫形式使用的Unity僅支持全屏渲染,不支持在屏幕的一部分進行渲染;
- 不支持載入多個Unity運行時實例,Unity可選擇附著與當前App的進程,也可以另啟一個進程(目前僅限於Android);
- 開發者需要調整第三方插件,包括原生插件和托管插件,目前我們做VR App就遇到了這種窘妝,庫支持堪憂;
- 生命周期事件的感知(目前最新版本已經添加了部分事件);
包體(粗略計算)
-
Android 空工程包體 2.2M
-
Unity IL2CPP ARM64 & V7a 空工程包體 9.87M & 9.12M
-
Unity Into Android 空工程包體 22.9M:
性能 - 記憶體
-
跑在同一進程,資源不能完全釋放
-
跑在不同進程,資源可以完全釋放
消息傳遞(用例後續有時間補齊)
- 傳統數據交換 - 函數傳參 - 支持
- 數據指針交換 - 推拉流數據 - 支持
- 共用紋理 - 相機採集數據 - 支持
- C++ 直接交互 - 底層庫 - 支持
建議參考
安卓 & U3D 交互
- AAR plug-ins and Android Libraries
- JAR plug-ins
- Extending the UnityPlayerActivity Code
- Native (C++) plug-ins
- Using Java and Kotlin source files as plug-ins