版本:Unity 6 (6000.0)
语言:English
Bonjour 浏览器示例
iOS 上的深度链接

将 Unity 集成到原生 iOS 应用程序中

此页面介绍如何将 Unity 运行时库集成到使用 Unity 作为库功能的 iOS 原生应用程序中。

您可以使用此功能在您的原生应用程序中包含由 Unity 提供支持的功能,例如 3D/2D 实时渲染、AR增强现实 更多信息
参见 术语表
体验、3D 模型交互或 2D 小游戏。Unity 运行时库公开了用于管理何时以及如何在原生应用程序中加载、激活和卸载内容的控件。

工作原理

要将 Unity 作为 iOS 的库使用,首先像往常一样从 Unity 构建您的 Xcode 项目。有关更多信息,请参阅 构建 iOS 应用程序

每个 Unity iOS Xcode 项目都具有以下 结构

  • UnityFramework 目标中的库部分,其中包含源代码、插件在 Unity 之外创建的一组代码,用于在 Unity 中创建功能。在 Unity 中可以使用两种类型的插件:托管插件(使用 Visual Studio 等工具创建的托管 .NET 程序集)和原生插件(特定于平台的原生代码库)。 更多信息
    参见 术语表
    和相关框架。它还会生成一个 UnityFramework.framework 文件。
  • Unity-iPhone 目标中的一个精简启动程序部分,其中包含应用程序表示数据并运行库。Unity-iPhone 目标对 UnityFramework 目标具有单个依赖项。

要将 Unity 集成到另一个 Xcode 项目中,您需要将这两个 Xcode 项目(原生项目和 Unity 生成的项目)合并到一个 Xcode 工作区中,并将 UnityFramework.framework 文件添加到原生 Xcode 项目的 Application 目标的 Embedded Binaries 部分。完成此操作后,您可以使用 UnityFramework 类来控制 Unity 运行时。

存储库 包含示例项目和插件,演示如何将 Unity 集成到 Xcode 项目中,以及进一步的文档。

UnityFramework 类

您可以通过 UnityFramework Objective-C 类的实例来控制 Unity 运行时,它是 UnityFramework.framework 的主要类。

方法 描述
+ (UnityFramework*)getInstance; 返回 UnityFramework 实例的单例类方法。
- (UnityAppController*)appController; 返回 UIApplicationDelegateUnityAppController 子类。这是原生端上的根 Unity 类,可以访问应用程序的与视图相关的对象,例如 UIViewUIViewControllersCADisplayLinkDisplayConnection
- (void)setDataBundleId:(const char*)bundleId; 设置 Unity 运行时应在其中查找 Data 文件夹的 Bundle。有关更多信息,请参阅有关 Data 文件夹 的文档。在调用 runUIApplicationMainWithArgcrunEmbeddedWithArgc 之前调用此方法。
- (void)runUIApplicationMainWithArgc:(int)argc argv:(char*[])argv; 在没有其他视图的主方法中运行 Unity 的默认方法。
- (void)runEmbeddedWithArgc:(int)argc argv:(char*[])argv appLaunchOpts:(NSDictionary*)appLaunchOpts; 当您需要在其他视图存在时运行 Unity 时,请调用此方法。
- (void)unloadApplication; 调用此方法以卸载 Unity 并卸载完成后接收对 UnityFrameworkListener 的回调。Unity 将释放其占用的大部分内存,但不会全部释放。您可以再次运行 Unity。
- (void)registerFrameworkListener:(id<UnityFrameworkListener>)obj; 注册接收 UnityFramework 生命周期相关事件回调的侦听器对象。
- (void)unregisterFrameworkListener:(id<UnityFrameworkListener>)obj; 注销侦听器对象。
- (void)showUnityWindow; 当非 Unity 视图正在显示时调用此方法,以同时显示已在运行的 Unity 视图。
- (void)pause:(bool)pause; 暂停 Unity。
- (void)setExecuteHeader:(const MachHeader*)header; 为了使 CrashReporter 正确工作,您必须在运行 Unity 之前调用此方法。
- (void)sendMessageToGOWithName:(const char*)goName functionName:(const char*)name message:(const char*)msg; 此方法是 UnitySendMessage 的代理。它按名称查找游戏对象并使用单个字符串消息参数调用 functionName。
(void)quitApplication:(int)exitCode; 调用此方法以完全卸载 Unity,并在 Unity 退出时接收对 UnityFrameworkListener 的回调。Unity 将释放所有内存。

注意:在此调用后,您将无法在同一进程中再次运行 Unity。您可以将 AppController 上的 quitHandler 设置为覆盖默认的进程终止。

限制

Unity 不控制运行时生命周期,因此 Unity 作为库可能不适用于所有可能的用例。已知的限制包括


  • iOS 的 Unity 作为库功能在 2019.3 中添加。NewIn20193
Bonjour 浏览器示例
iOS 上的深度链接