本文轉自Unity Connect
從Unity 2019.3.a2開始茬暇,我們通過把Unity運行時組件和內(nèi)容集成到原生平臺項目叽讳,在原生應用中將Unity作為庫使用拟蜻。
本文將分享如何將Unity以庫形式集成到原生iOS和Android應用。了解更多信息震捣,請閱讀:《在原生iOS或Android應用中將Unity作為庫使用》荔棉。
請訪問云盤下載示例項目
下載鏈接: https://pan.baidu.com/s/1JFWjbrh2x-qAsCzMwLywLA
提取碼: 9a71
iOS
請iOS開發(fā)者使用Unity 2019.3.a2及更高版本,以及Xcode 9.4及更高版本蒿赢。
下載Unity 2019.3.a2:https://unity3d.com/alpha/2019.3
1润樱、下載和解壓項目
我們會把該Unity項目加入到原生iOS應用,Assets/Plugins/iOS文件夾中的文件用于使Unity播放器和原生應用進行通信羡棵。
我們提供了一個簡單的Xcode單視圖應用壹若,該項目擁有UI,可以使用UnityFrameworkLoad()加載播放器。
為了方便起見店展,我們把二個項目解壓到相同文件夾下养篓。
2、生成iOS的Xcode項目
我們按正常操作生成Xcode項目即可赂蕴。
首先在Unity編輯器打開UnityProject項目柳弄,選擇Menu -> Window -> Package Manager,因為2.0.8版本不兼容使用Unity作為庫概说,所以要移除Ads資源包碧注,或更新Ads資源包到v 3.*版本。
選擇Menu -> Edit -> Player Settings -> Player -> iOS設置標簽頁 -> Identification Section席怪,設置有效的Bundle Identification和Signing Team ID应闯,以避免后續(xù)步驟出現(xiàn)Xcode簽名問題。
打開Menu -> File -> Builds Settings挂捻,在此選擇并切換平臺為iOS。將UnityProject項目構建到iosBuild文件夾船万。
3刻撒、設置Xcode工作空間
Xcode工作空間允許同時處理多個項目,并結合它們的結果耿导。 我們在Xcode打開NativeiOSApp.xcodeproj声怔。選擇File -> New -> Workspace,創(chuàng)建工作空間舱呻,把它保存在UaaLExample/both.xcworkspace醋火。
關閉NativeiOSApp.xcodeproj項目,此后的步驟會在剛創(chuàng)建的工作空間項目完成箱吕。
選擇File -> Add Files to “both”芥驳,把NativeiOSApp.xcodeproj和第2步生成的Unity-iPhone.xcodeproj添加到相同等級的工作空間。
4茬高、添加UnityFramework.framework
我們以框架的形式添加Unity播放器到NativeiOSApp兆旬,它目前不會改變NativeiOSApp的行為。
首先從NativeiOSApp項目選擇NativeiOSApp目標怎栽。在General -> Embedded Binaries中按下+按鈕丽猬。選擇Unity-iPhone/Products/UnityFramework.framework。
我們從Linked Frameworks and Libraries移除UnityFramework.framework熏瞄,選中該條目并按下-按鈕即可脚祟。
5、公開NativeCallProxy.h
原生應用會實現(xiàn)下面文件定義的NativeCallsProtocol强饮。
首先找到并選擇Unity-iPhone / Libraries / Plugins / iOS / NativeCallProxy.h由桌。
然后在Target Membership中勾選UnityFramework,通過UnityFramework右側的下拉圖標,把標頭可見性設為Public沥寥。
6碍舍、使Data文件夾成為UnityFramework的一部分
默認情況下,Data文件夾是Unity-iPhone目標的一部分邑雅,我們會通過修改它片橡,使所有內(nèi)容封裝到單個框架文件中。
我們把Data文件夾的Target Membership改為UnityFramework淮野。
在之前的改動后捧书,為了使Unity-iPhone項目繼續(xù)工作,Unity播放器需要通過從Unity-iPhone/MainApp/main.mm進行調用骤星,指向Data文件夾所處的新位置经瓷。
[ufw setDataBundleId: "com.unity3d.framework"];
在這種情況下不支持按需使用資源。為了使它們正常工作洞难,我們不會使用前面的調用舆吮,因為默認情況下Data文件夾位于mainBundle,所以我們要復制Data文件夾到原生應用队贱,并跳過前面的調用色冀。
運行 所有內(nèi)容已經(jīng)準備好針對二個項目進行構建,運行和調試柱嫌,即:Unity-iPhone項目和NativeiOSApp項目锋恬,選擇Scheme為NativeiOSApp或Unity-iPhone。
如果一切順利编丘,我們可以運行NativeiOSApp与学。
完整項目說明 在集成步驟中遇到問題,你可以嘗試已經(jīng)準備好構建和部署的完整項目嘉抓,只需要修復Xcode的簽名即可索守。
NativeiOSApp目標
Unity-iPhone目標(可選)
UnityFramework目標不需要簽名
請下載并解壓完整項目文件,在Xcode打開both.xcworkspace掌眠,運行NativeiOSApp Scheme蕾盯。
關鍵要點
Unity播放器由UnityFramework對象控制。為了獲取該對象蓝丙,我們要調用UnityFrameworkLoad级遭,它會加載UnityFramework.framework,然后返回單個實例到UnityFramework類渺尘,請觀察Unity-iPhone/UnityFramework/UnityFramework.h挫鸽,了解它的API。
請在NativeiOSApp/NativeiOSApp/MainViewController.mm文件中或Unity-iPhone/MainApp/main.mm文件中觀察UnityFrameworkLoad鸥跟。
#include <UnityFramework/UnityFramework.h>
UnityFramework* UnityFrameworkLoad()
{
NSString* bundlePath = nil;
bundlePath = [[NSBundle mainBundle] bundlePath];
bundlePath = [bundlePath stringByAppendingString: @"/Frameworks/UnityFramework.framework"];
NSBundle* bundle = [NSBundle bundleWithPath: bundlePath];
if ([bundle isLoaded] == false) [bundle load];
UnityFramework* ufw = [bundle.principalClass getInstance];
if (![ufw appController])
{
// 首次初始化Unity
[ufw setExecuteHeader: &_mh_execute_header];
// 同步Data文件夾的Target Membership設置
[ufw setDataBundleId: "com.unity3d.framework"]
}
return ufw;
}
Android
請Android開發(fā)者使用Unity 2019.3.a2及更高版本丢郊,以及Android Studio 3.3.2及更高版本盔沫。
1、下載和解壓項目
請下載Unity項目枫匾,該項目是要加入原生Android應用的示例Assets/Plugins/Android文件夾中有擴展UnityPlayerActivity的OverrideUnityActivity文件架诞。
我們提供的原生Android項目是來自Android Studio模板的Basic Activity應用程序,我們會把前面的Unity項目加入到這里干茉。該項目有UI和MainUnityActivity來擴展OverrideUnityActivity谴忧,可以使用Intent啟動MainUnityActivity。
為了方便起見角虫,我們把二個項目解壓到相同文件夾下沾谓。
2、生成Android平臺的Gradle項目
我們在Unity編輯器打開UnityProject項目戳鹅,點擊Menu -> File -> Build Settings打開Build Settings均驶。
選擇并切換為Android Platform,勾選Export Project選項枫虏。
我們把UnityProject導出到androidBuild文件夾妇穴,該文件夾結構如下圖所示。
3模软、把Unity Library模塊添加到NativeAndroidApp
現(xiàn)在把androidBuild/unityLibrary模塊添加給Android Studio 中的NativeAndroidApp Gradle項目:
我們在Android Studio打開NativeAndroidApp伟骨,然后打開settings.gradle文件。在該文件末尾燃异,添加指向unityLibrary的新項目。
include ':unityLibrary'
project(':unityLibrary').projectDir=new File('..\\UnityProject\\androidBuild\\unityLibrary')
打開build.gradle文件继蜡,把下面代碼添加到dependencies代碼塊回俐。
implementation project(':unityLibrary')
打開build.gradle文件,把下面代碼添加到allprojects{repositories{代碼塊稀并。
flatDir {
dirs "${project(':unityLibrary').projectDir}/libs"
}
Gradle文件已經(jīng)修改仅颇,單擊Sync Now。
如果一切順利碘举,我們會看到unityLibrary模塊添加到Android視圖中忘瓦。
運行 現(xiàn)在已經(jīng)準備好進行構建,運行和調試引颈。
如果一切順利耕皮,我們應該可以運行NativeAndroidApp。
請注意:在應用程序安裝到設備后蝙场,會出現(xiàn)二個啟動應用程序的圖標凌停,請把<intent-filter>...</intent-filter>從unityLibrary的AndroidManifest.xml去掉,僅保留集成版本售滤。
完整項目說明
如果在集成步驟中遇到問題罚拟,你可以嘗試已經(jīng)準備好構建和部署的完整項目台诗。請下載并解壓完整項目文件,在Android Studio打開NativeAndroidApp赐俗。
小結
如何將Unity以庫形式集成到原生iOS和Android應用為大家介紹到這里拉队,請下載示例項目動手操作起來吧。
原文鏈接:https://connect.unity.com/p/ru-he-jiang-unityyi-ku-xing-shi-ji-cheng-dao-yuan-sheng-ioshe-androidying-yong?app=true
更多Unity干貨資源阻逮,請戳上方鏈接下載Unity官方app粱快。