在原生iOS或Android应用中将Unity作为库使用
Unity 2019.3将添加支持,可以将Unity作为原生Android/Java和iOS/Objective C应用控制的库,以便轻松加入AR和其它Unity功能。
在一些情况下,使用Android/Java和iOS/Objective C等原生平台技术的开发者可能希望在应用或游戏中加入Unity提供的功能,通常用于3D或2D实时渲染。
从Unity 2019.3.a2开始,我们通过把Unity运行时组件和内容集成到原生平台项目,在原生应用中将Unity作为库使用。Unity Runtime Library公开了控制功能,从而在原生应用中管理加载、激活和卸载的时间和方式。
这意味着开发者可以将Unity所能实现的增强现实AR、3D/2D实时渲染、2D迷你游戏等功能,直接添加到自己的原生移动应用。
请注意:将Unity作为库使用,要求开发者对Android/Java和iOS/Objective C的架构有着深入的了解。
限制
我们测试了很多种将Unity作为库并由原生应用托管的情况,但由于Unity不再控制运行时的生命周期,因此我们无法确保它可以在所有用例都正常工作,例如:
作为库使用的Unity仅支持全屏渲染,不支持在屏幕的一部分进行渲染。
不支持加载多个Unity运行时实例。
开发者需要调整第三方插件,包括原生插件和托管插件,从而让它们正常工作。
项目结构改变
Unity运行时库会公开控制功能,以管理在原生应用中加载,激活和卸载的时间和方式。移动应用的构建过程总体上依旧相同,Unity将创建iOS Xcode和Android Gradle项目。
为了启用该功能,我们修改了生成iOS Xcode和Android Gradle项目的结构,结构如下:
库:iOS框架和Android Archive(AAR)文件,包含所有源文件和插件。
精简的启动器:包含应用程序展示数据,它会运行库部分。
我们将在后续文章中,提供关于如何把iOS / Android库部分加入到原生应用程序的分步讲解。下面介绍Xcode项目和Android Gradle项目的变化。
iOS
主要功能围绕Xcode项目展开,以获得名为UnityFramework的额外目标。此目标包括源/插件和依赖框架,并生成UnityFramework.framework文件。启动屏幕,Xib,图标,数据等保留在Unity-iPhone目标中。Unity-iPhone目标将对UnityFramework目标具有单一依赖性。
UnityFramework提供简单的API来管理播放器从本机端加载/卸载,在需要时暂停/取消暂停,向游戏对象发送消息并设置播放器数据文件夹所在的捆绑包,这样就可以在一个地方拥有Unity播放器需要运行的所有框架文件。
改变
将Unity作为库的功能对API和Xcode项目结构带来了一些变化。
对于大多数用例而言,所有内容会和原先一样工作,但如果你开发或使用插件、自定义BuildPostProcessor、PBXProject和CI,即使在开发者没有将Unity作为库使用,这些变化也可能会影响项目。
1
PBXProject
PBXProject.GetUnityTargetName和pbxProject->TargetGuidByName(“Unity-iPhone”)都已经被弃用。
我们改为使用pbxProject->GetUnityFrameworkTargetGuid(),它用于源代码、插件、依赖框架和源代码构建选项,或使用pbxProject->GetUnityMainTargetGuid()。使用已弃用函数会遇到异常。
// 下面代码已被弃用
string targetGuid = proj.TargetGuidByName("Unity-iPhone");
string targetGuid = proj.TargetGuidByName(PBXProject.GetUnityTargetName());
// 请改为调用下面二个代码之一
string targetGuid = proj.GetUnityFrameworkTargetGuid();
string targetGuid = proj.GetUnityMainTargetGuid();
如何在资源包或自定义后处理程序中,同时支持旧的和新的代码路径?
在允许情况下使用插件导入器功能,例如:指定额外框架。
使用反射。
string mainTargetGuid;
string unityFrameworkTargetGuid;
var unityMainTargetGuidMethod = proj.GetType().GetMethod("GetUnityMainTargetGuid");
var unityFrameworkTargetGuidMethod = proj.GetType().GetMethod("GetUnityFrameworkTargetGuid");
if (unityMainTargetGuidMethod != null && unityFrameworkTargetGuidMethod != null)
{
mainTargetGuid = (string)unityMainTargetGuidMethod.Invoke(proj, null);
unityFrameworkTargetGuid = (string)unityFrameworkTargetGuidMethod.Invoke(proj, null);
}
else
{
mainTargetGuid = proj.TargetGuidByName ("Unity-iPhone");
unityFrameworkTargetGuid = mainTargetGuid;
}
2
ProjectCapabilityManager
ProjectCapabilityManager现在会接收目标的全局唯一标识符GUID。
3
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
示例
将Unity作为库集成到原生iOS应用的示例,请参考:
https://forum.unity.com/threads/integration-unity-as-a-library-in-native-ios-app.685219/
Android
如果使用Unity作为库,Android Gradle项目的结构会发生改变。如果使用自定义mainTemplate.gradle或AndroidManifest.xml,这些改变也会影响项目或Unity插件。
此前,Unity会使用单个Gradle模块来构建Android应用。现在,Unity会使用二个模块创建Gradle项目,即:unityLibrary模块和启动器模块。
改变
unityLibrary模块包含Unity运行时和项目数据。该模块是一个可以轻松集成到任何其它Gradle项目中的库,也可以把Unity嵌入到现有原生Android项目中。
启动器模块包含所有图标和应用名称,它是一个简单的Android应用程序,可以启动Unity。
1
Gradle项目结构
将Unity作为库会提供新的Gradle项目结构,它会更好的符合Android Studio项目最佳结构。该结构中有一个根文件夹,其中包含一些可以单独构建和使用的子项目。它让导入Unity Android Studio项目更加简单。
2
Gradle模板工作流程
Gradle模板会描述和配置使用Gradle构建Android应用的方法。每个Gradle模板代表一个Gradle项目,Gradle项目可以包括和依赖其它Gradle项目。
将Unity作为库的Gradle模板文件如下:
baseProjectTemplate.gradle:包含所有其它模板和Gradle项目共享的配置,即Android Gradle插件上的代码库和依赖。
launcherTemplate.gradle:包含如何构建Android应用的指令,例如:打包,签名和APK分离等,具体取决于unityLibrary项目,它会输出一个APK文件或App Bundle。
mainTemplate.gradle:包含如何把Unity构建为库的指令,它会输出.aar格式文件,用户可以提供自定义模板来重写Unity模板,包括编辑器设置。
libTemplate.gradle:与之前的工作方式相同。
3
清单工作流程
将Unity作为库会改变Unity Android应用清单文件的使用方式。此前会有一个AndroidManifest.xml文件,用于给Android应用提供图标、行为、权限和其它设置。
使用新系统后,我们有二个清单文件,而不是一个:
LauncherManifest.xml:负责处理图标、应用名称、开始行为及其目的、安装位置、支持的屏幕大小和设置“isGame”。
LibraryManifest.xml:负责声明Unity行为、权限、Unity行为使用的主题、VR模式、VR性能、使行为不可以调整大小、设置最大高宽比、应对配置改动、朝向、启动模式、Android UI硬件加速、使用的功能,例如游戏手柄或图形API和槽口支持。
该清单文件可以通过在Plugins/Android文件夹中提供自定义AndroidManifest.xml文件来重写。
示例
将Unity作为库集成到原生Android应用的示例,请参考:
https://forum.unity.com/threads/integration-unity-as-a-library-in-native-android-app.685240/
推动改变营销的技术
作为库的Unity可以为不同行业的各种用例提供巨大优势,品牌和创意公司可以轻松地把AR直接加入原生移动应用。
前沿品牌会看到添加AR到传统营销活动的价值,由于Unity支持把Unity用作库,因此添加过程会得到简化。品牌和创意公司不再需要重新构建应用以加入AR功能,或自己开发解决方案来把Unity用作库。
消费者已经准备好迎接AR营销,AR让品牌和消费者建立起个人关系,我们很高兴提供推动营销发展的解决方案。
了解品牌和创意公司如何使用Unity,请访问Unity解决方案网站:
https://unity.com/solutions/brands-and-creative-agencies
更多Unity最新信息,请关注Unity Connect平台(Connect.unity.com)下载Unity Connect APP,请点击此处。 观看部分Unity官方视频,请关注B站帐户:Unity官方。
推荐阅读
Unity Reflect:一键转换BIM数据至实时3D环境
点个“在看”,表达你的态度