Unity3D和移動端(IOS)混合開發(二)

上一篇:IOS爲主導添加Unity3D模塊的開發方式ios


本篇總結IOS爲主導集成Unity3D庫的混合開發方式。
從Unity 2019.3.a2開始,咱們經過把Unity運行時組件和內容集成到原平生臺項目,在原生應用中將Unity做爲庫使用。Unity Runtime Library公開了控制功能,從而在原生應用中管理加載、激活和卸載的時間和方式。xcode

Xcode 9.4以上
Unity版本2019.3.a2 +app

3.IOS爲主導集成Unity3D庫的混合開發方式。

Unity運行時庫會公開控制功能,以管理在原生應用中加載,激活和卸載的時間和方式。移動應用的構建過程整體上依舊相同,Unity將建立iOS Xcode,爲了啓用該功能,咱們修改了生成iOS Xcode
一、庫:iOS框架,包含全部源文件和插件。
二、精簡的啓動器:包含應用程序展現數據,它會運行庫部分。框架

  • 主要功能圍繞Xcode項目展開,以得到名爲UnityFramework的額外目標。此目標包括源/插件和依賴框架,並生成UnityFramework.framework文件。啓動屏幕,Xib,圖標,數據等保留在Unity-iPhone目標中。Unity-iPhone目標將對UnityFramework目標具備單一依賴性。
  • UnityFramework提供簡單的API來管理播放器從本機端加載/卸載,在須要時暫停/取消暫停,向遊戲對象發送消息並設置播放器數據文件夾所在的捆綁包,這樣就能夠在一個地方擁有Unity播放器須要運行的全部框架文件。
  • 將Unity做爲庫的功能對API和Xcode項目結構帶來了一些變化。
  • 對於大多數用例而言,全部內容會和原先同樣工做,但若是你開發或使用插件、自定義BuildPostProcessor、PBXProject和CI,即便在開發者沒有將Unity做爲庫使用,這些變化也可能會影響項目。
    PBXProject :PBXProject.GetUnityTargetName和pbxProject->TargetGuidByName(「Unity-iPhone」)都已經被棄用。咱們改成使用pbxProject->GetUnityFrameworkTargetGuid(),它用於源代碼、插件、依賴框架和源代碼構建選項,或使用pbxProject->GetUnityMainTargetGuid()。使用已棄用函數會遇到異常。
    ProjectCapabilityManager :ProjectCapabilityManager如今會接收目標的全局惟一標識符GUID。
    xcodebuild :一些構建設置擁有後綴來指定確切目標,這些後綴有:_APP表示應用目標,_FRAMEWORK表示框架目標。

    在構建xcodebuild時,這樣使用加入後綴的版本:ide

    • PRODUCT_NAME -> PRODUCT_NAME_APP
    • PROVISIONING_PROFILE -> PROVISIONING_PROFILE_APP
    • PROVISIONING_PROFILE_SPECIFIER -> PROVISIONING_PROFILE_SPECIFIER_APP
    • OTHER_LDFLAGS -> OTHER_LDFLAGS_FRAMEWORK

步驟:

(1)Unity建立工程和Xcode建立NativeiOSApp.xcodeproj工程,Unity工程選擇IOS平臺生成Xcode的項目包。
(2)Xcode工做區容許同時處理多個項目並組合其產品,從Xcode打開NativeiOSApp.xcodeproj工程,設置工做空間並保存,將Unity導出的Xcode項目包添加到同一級別的工做區。以下圖:
Unity3D和移動端(IOS)混合開發(二)
(3)添加UnityFramework.framework,以框架形式向UnityiOSApp添加Unity Player,它仍然不會改變NativeiOSApp的行爲;
從NativeiOSApp項目中選擇General標籤,按+號選擇Unity-iPhone / Products / UnityFramework.framework從連接的框架和庫中刪除UnityFramework.framework(選擇它並按-)
Unity3D和移動端(IOS)混合開發(二)
(4)公開NativeCallProxy.h,NativeiOSApp.xcodeproj應用程序實現如下文件中定義的NativeCallsProtocol。
選擇Unity-iPhone 中 NativeCallProxy.h啓用UnityFramework並設置公共標題可見性(UnityFramework右側的小下拉菜單)
Unity3D和移動端(IOS)混合開發(二)
(5)使Data文件夾成爲UnityFramework的一部分(默認狀況下,Data文件夾是Unity-iPhone目標的一部分,咱們將其更改成將全部內容封裝在一個框架文件中)
Unity3D和移動端(IOS)混合開發(二)
更改以後,Unity-iPhone項目能夠繼續工做,Unity Player須要經過從Unity-iPhone 的 main.mm調用來指向數據所在的新位置:函數

[ ufw setDataBundleId : 「 com.unity3d.framework」 ] ;

以下圖:
Unity3D和移動端(IOS)混合開發(二)ui

最後,準備好就能夠調試了(選擇方案NativeiOSApp或Unity-iPhone)
Unity3D和移動端(IOS)混合開發(二)插件

***注意:Unity播放器是由UnityFramework對象控制。要得到它,請調用UnityFrameworkLoad(若是沒有加載,它將加載UnityFramework.framework,並將單例實例返回到UnityFramework類,請觀察Unity-iPhone /中UnityFramework.h的API)和觀察UnityFrameworkLoad:NativeiOSApp中的MainViewController.mm或Unity-iPhone中的 main.mm3d


官方問題探討區:
https://forum.unity.com/threads/integration-unity-as-a-library-in-native-ios-app.685219/調試

對於IOS上述三種方式總結:

  • Unity爲主導和IOS交互,IOS封裝形式,優勢:適用於Unity項目,導出後直接打包,不須要過多配置;缺點:如調用庫多,操做方法麻煩。或者IOS爲主開發,Unity導出的工程繼續開發,優勢:能夠把原生代碼封裝,導出後只需配置;缺點:每次導出都得修改配置
  • 以iOS端集成Unity庫方式,優勢:Framework是一種打包方式,將庫的二進制文件,頭文件和有關的資源文件打包到一塊兒,方便管理和分發;分工更加明確,提升開發效率 ;極大地簡化了操做; 升級庫更加方便
    ;複用性更好,能迅速的組成更多的App
  • 以iOS端添加Unity模塊方式,優勢:維護方便,報錯容易查找錯誤,缺點:每次導出工程都得從新使用Xcode進行配置,模塊添加,操做繁瑣。
相關文章
相關標籤/搜索