Version: 2023.2
构建适用于 iOS 的插件
Deep linking on iOS

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

本页说明如何使用“Unity 用作库”功能将 Unity 运行时库集成到 iOS 原生应用程序中。

使用此功能可以在原生应用程序中包含 Unity 支持的功能(例如 3D/2D 实时渲染、AR 体验、3D 模型交互或 2D 迷你游戏)。Unity 运行时库公开了多种控件来管理何时以及如何在原生应用程序中加载、激活和卸载内容。

工作原理

要将“Unity 用作 iOS 库”,请像往常一样,先从 Unity 构建 Xcode 项目(有关更多信息,请参阅 iOS 构建设置)。

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

  • UnityFramework 目标中的一个库部分,其中包含源、插件和相关框架。它还生成 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 类(该类是 UnityFramework.framework 的主体类)的实例来控制 Unity 运行时:

方法 描述
+ (UnityFramework*)getInstance; 单例类方法,可将实例返回到 UnityFramework
- (UnityAppController*)appController; 返回 UIApplicationDelegateUnityAppController 子类。这是原生端的根 Unity 类,可以访问应用程序的视图相关对象,例如 UIViewUIViewControllersCADisplayLinkDisplayConnection
- (void)setDataBundleId:(const char*)bundleId; 设置捆绑包,Unity 运行时应在其中查找 Data 文件夹。有关更多信息,请参阅 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; 必须在运行 Unity 之前调用此命令,CrashReporter 才能正常工作。
- (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 用作库”可能并不适用于所有可能的用例。已知限制包括:

  • “Unity 用作库”仅支持全屏渲染,不支持在部分屏幕中渲染。
  • 您不能加载多个 Unity 运行时实例。
  • 您可能需要调整第三方插件(原生托管插件)才能使用 Unity 运行时。

  • 2019.3 中添加了“Unity 用作 iOS 库”。NewIn20193
构建适用于 iOS 的插件
Deep linking on iOS