本篇总结IOS为主导集成Unity3D库的混合开发方式。
从Unity 2019.3.a2开始,我们通过把Unity运行时组件和内容集成到原生平台项目,在原生应用中将Unity作为库使用。Unity Runtime Library公开了控制功能,从而在原生应用中管理加载、激活和卸载的时间和方式。
Xcode 9.4以上
Unity版本2019.3.a2 +
3.IOS为主导集成Unity3D库的混合开发方式。
Unity运行时库会公开控制功能,以管理在原生应用中加载,激活和卸载的时间和方式。移动应用的构建过程总体上依旧相同,Unity将创建iOS Xcode,为了启用该功能,我们修改了生成iOS Xcode
1、库:iOS框架,包含所有源文件和插件。
2、精简的启动器:包含应用程序展示数据,它会运行库部分。
- 主要功能围绕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时,这样使用加入后缀的版本:
- 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项目包添加到同一级别的工作区。如下图:
(3)添加UnityFramework.framework,以框架形式向UnityiOSApp添加Unity Player,它仍然不会改变NativeiOSApp的行为;
从NativeiOSApp项目中选择General标签,按+号选择Unity-iPhone / Products / UnityFramework.framework从链接的框架和库中删除UnityFramework.framework(选择它并按-)
(4)公开NativeCallProxy.h,NativeiOSApp.xcodeproj应用程序实现以下文件中定义的NativeCallsProtocol。
选择Unity-iPhone 中 NativeCallProxy.h启用UnityFramework并设置公共标题可见性(UnityFramework右侧的小下拉菜单)
(5)使Data文件夹成为UnityFramework的一部分(默认情况下,Data文件夹是Unity-iPhone目标的一部分,我们将其更改为将所有内容封装在一个框架文件中)
更改之后,Unity-iPhone项目可以继续工作,Unity Player需要通过从Unity-iPhone 的 main.mm调用来指向数据所在的新位置:
[ ufw setDataBundleId : “ com.unity3d.framework” ] ;
如下图:
最后,准备好就可以调试了(选择方案NativeiOSApp或Unity-iPhone)
***注意:Unity播放器是由UnityFramework对象控制。要获得它,请调用UnityFrameworkLoad(如果没有加载,它将加载UnityFramework.framework,并将单例实例返回到UnityFramework类,请观察Unity-iPhone /中UnityFramework.h的API)和观察UnityFrameworkLoad:NativeiOSApp中的MainViewController.mm或Unity-iPhone中的 main.mm
官方问题探讨区:
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进行配置,模块添加,操作繁琐。