如果想让原生平台(例如 Java/Android、Objective C/iOS 或 Windows Win32/UWP)包含 Unity 功能,可以通过Unity 生成UnityFramework静态库包含到项目中进行实现。

Unity 从2019.3 开始支持将 Unity 运行时组件集成到原生平台项目中,从而将Unity 静态库用于其他应用程序中。
这样就可以以嵌入的方式让APP使用 3D 或 2D 实时渲染的内容,例如 AR 体验、与 3D 模型交互、2D 迷你游戏等。
Unity 静态库提供了多种方法来管理如何在原生应用程序中加载、激活和卸载Unity3DPlayer。
以下平台目前支持Unity 用作库:Android,iOS,Windows 和通用 Windows 平台。
使用Unity构建iOS工程
先使用 Unity 构建 一个Xcode 项目,然后制作iOS静态库。
每个 Unity iOS Xcode 项目具有以下结构:
UnityFramework 部分,其中包含源、插件和相关框架。它还生成 UnityFramework.framework 文件。
Unity-iPhone 部分,其中包含应用程序需要的资源数据和运行库。Unity-iPhone Target对 UnityFramework 具有单一依赖关系,所以直接运行Unity-iPhone,构建出UnityFramework 。
要将 Unity 集成到另一个 Xcode 项目中,可以通过将 UnityFramework.framework 文件添加到原生 Xcode 项目的应用程序 (Application) 的依赖库中,并设置成嵌入 (Embedded Binaries) 。完成此操作后,可以使用 UnityFramework 类来控制 Unity 运行时。
可通过 UnityFramework Objective-C 类(该类是 UnityFramework.framework 的主体类)的实例来控制 Unity 运行时:
UnityFramework提供了一系列的方法,举例如下:
+ (UnityFramework*)getInstance; 单例类方法,可将实例返回到 UnityFramework。
- (UnityAppController*)appController; 返回 UIApplicationDelegate 的 UnityAppController 子类。这是原生端的根 Unity 类,可以访问应用程序的视图相关对象,例如 UIView、UIViewControllers、CADisplayLink 或 DisplayConnection。
- (void)setDataBundleId:(const char*)bundleId; 设置捆绑包,Unity 运行时应在其中查找 Data 文件夹。有关更多信息,请参阅 Data 文件夹的相关文档。应在调用 runUIApplicationMainWithArgc 或 runEmbeddedWithArgc 之前调用此方法。
- (void)runUIApplicationMainWithArgc:(int)argc argv:(char*[])argv; 从没有其他视图的主要方法中运行 Unity 的默认方式。
 
制作iOS静态库
1.先创建一个UnityCallNative类,可以在iOS项目中创建。
UnityCallNative.h中定义声明一个供unity调用原生的方法,注意这里的方法定义必须使用C语法。
UnityCallNative.m中实现.h中定义的接口,注意实现的地方是除@implementation-end只外的地方,也就是直接把@implementation-end以及中间的内容都删除,然后使用C语言来实现,C语言的调用部分可以使用OC实现。
比如:
UnityCallNative.h文件声明方法
extern "C" {
void outputAppendString("test1", "test2");
}
UnityCallNative.m文件实现方法
void outputAppendString(string str1, string str2) {
....
}
2.将完成后的UnityCallNative类添加到Unity项目中
在Unity的Project/Asserts/Plugins/ios/目录下添加这2个文件。
3.通过Unity项目File-Buile Settings-iOS-Build 重新构建出新的Unity-iPhone项目
4.把Data资源文件夹,UnityCallNative.h 的Target MemberShips 设置到UnityFromework下(打勾),同时把UnityCallNative.h作用域设置成public
5.构建UnityFramework工程,生成静态库
6.把UnityFramework静态库导入到iOS工程中,同时在General-Libaray,Frameworkd设置成Embed&Sign
Unity3D与iOS原生交互
Unity3D调iOS
1.在Unity的脚本文件中使用原生项目暴露的方法
Unit3D中新建一个脚本文件,引入交互服务。
using System.Runtime.InteropServices;

public class ChangeLabel : MonoBehaviour
{
[DllImport("__Internal")]
static extern void outputAppendString(string str1, string str2); // 声明ios原生定义的C方法 void Start() {
#if UNITY_IPHONE
outputAppendString("test1", "test2"); // 调用ios原生定义的C方法
#endif
}
}
iOS原生调用Unity3D
原生调Unity3D通过下面这一句函数就够了。
举个例子 : 
UnitySendMessage("UIChargeMoneyPage", "callback", "0");
在UnityInterface.h声明中声明了下面的函数
UnitySendMessage(const char * GameObjectName, const char *methodName, const char *msg);
GameObjectName: Unity场景中的游戏对象
methodName: 游戏对象下绑定的脚本中的函数名
msg:函数的参数

另外:

UnityInterface.h文件是Unity导出的iOS项目中包含的。
在发送消息到Unity前,要确保成功导入了UnityInterface.h文件。
 

参考文章:

https://docs.unity3d.com/cn/2021.1/Manual/UnityasaLibrary-iOS.html
https://juejin.cn/post/6844903933790388231
https://blog.51cto.com/myselfdream/2559580
https://blog.51cto.com/myselfdream/2559599
https://blog.csdn.net/weixin_42714258/article/details/122454019

集成Unity3D到iOS应用程序中的更多相关文章

  1. 在iOS应用程序中使用Frida绕过越狱检测

           阿里聚安全在之前的三篇博客中介绍了利用Frida攻击Android应用程序,整个过程仿佛让开发者开启上帝视角,在本篇博客中,我们将会介绍在iOS应用程序中使用Frida绕过越狱检测.即使 ...

  2. Delphi for iOS开发指南(8):在iOS应用程序中使用Tab组件来显示分页

    Delphi for iOS开发指南(8):在iOS应用程序中使用Tab组件来显示分页 在FireMonkey iOS应用程序中的Tab Tab由FMX.TabControl.TTabControl定 ...

  3. Delphi for iOS开发指南(7):在iOS应用程序中使用WebBrowser组件

    Delphi for iOS开发指南(7):在iOS应用程序中使用WebBrowser组件 在FireMonkey iOS应用程序中使用WebBrowser 在iOS平台上,FireMonkey使用T ...

  4. Delphi for iOS开发指南(6):在iOS应用程序中使用ComboBox组件来从列表中选择某一项

    http://blog.csdn.net/delphiteacher/article/details/8924110 Delphi for iOS开发指南(6):在iOS应用程序中使用ComboBox ...

  5. Delphi for iOS开发指南(5):在iOS应用程序中使用Calendar组件来选择日期

    http://blog.csdn.net/delphiteacher/article/details/8923519 在FireMonkey iOS应用程序中的Calendar FireMonkey使 ...

  6. Delphi for iOS开发指南(4):在iOS应用程序中使用不同风格的Button组件

    http://blog.csdn.net/DelphiTeacher/article/details/8923481 在FireMonkey iOS应用程序中的按钮 FireMoneky定义了不同类型 ...

  7. 报表控件NCReport教程:集成NCReport到Qt应用程序中

    NCReport是一款轻量级.快速.多平台.简单易用的基于Qt toolkit的C++编写的报表解决方案,目前主要包括报表渲染库和报表设计器GUI应用程序. 但是好多使用NCReport控件的朋友都不 ...

  8. IOS在一个程序中启动另一个程序

    尽管iPhone不允许同时运行两个应用程序,我们可以从自己的应用程序中启动另一个应用程序,并且可以在应用程序之间共享数据.我们可以使用UIApplication类的openURL:方法从一个应用程序来 ...

  9. Xcode中iOS模拟器程序中的plist路径

    Xcode6.4里写了个简单的iOS程序在模拟器中跑. 其中用到了NSUserDefaults来保存属性文件plist,那么这个文件实际路径在哪里呢?在网上搜了一下,发现几种说法(*表示当前用户名): ...

  10. ios 在程序中使用iCloud

    注意,这里说的使用icould不是用icloud进行系统备份,那个功能不需要我们写代码,备份到icloud的东西我们也不能操作.我们指的是以下这3种icloud使用方法: 这里有3中使用方法, Key ...

随机推荐

  1. Codeforces Round #725 (Div. 3) A~G 题解记录

    补题链接:Here 1538A. Stone Game 数组 \(a\) 的大小为 \(n\) ,请问每次可以删除最左和最右侧的元素,请问最少执行多少次能删除掉数组中的最大值和最小值 (\(1\le ...

  2. 版本升级 | v1.0.12发布,许可证风险早知道

    新版本来啦~~~~ 一.v1.0.12更新内容 优化许可证检出功能,可通过JSON / HTML / SPDX 报告获知许可证信息 支持HTML报告自定义分页 二.更新说明 1. 优化许可证检出功能, ...

  3. 文心一言 VS 讯飞星火 VS chatgpt (181)-- 算法导论13.4 4题

    四.用go语言,在 RB-DELETE-FIXUP 代码的哪些行中,可能会检查或修改哨兵 T.nil ? 文心一言: RB-DELETE-FIXUP 是红黑树中的一个操作,用于在删除一个节点后进行必要 ...

  4. C#约瑟夫环问题算法

    /// <summary> /// 约瑟夫环问题算法 /// </summary> /// <param name="total">总人数< ...

  5. 项目使用 GlobalExceptionHandler 自定义异常 一

    博主原创,未经允许不得转载: 每个项目都有自己的一套异常类的定义.总结一下,项目中使用自定义异常比较好的封装. 1.定义项目中统一使用的异常类,用于捕获项目中的自定义异常等: package com. ...

  6. 京东App秒杀抢购流程接口分析(基于pypp技术)

    App数据抓包必需工具 必需工具:小米手机,Charles,HttpCanary 从2022年2月后,京东只限于从app发起抢购,所以,网上的很多工具已经无效了.只能分析app端的底层协议和流程. g ...

  7. springboot启动流程 (2) 组件扫描

    SpringBoot的组件扫描是基于Spring @ComponentScan注解实现的,该注解使用basePackages和basePackageClasses配置扫描的包,如果未配置这两个参数,S ...

  8. SV 数据类型-3

    联合数组 在内存中分配的空间可以是不连续的 联合数组方法 数组的方法 数组使用推荐 结构体 枚举类型 字符串变量类型String 操作符

  9. APB Slave Mux

    基于APB slave mux我们可以快速地将多个apb slave连接在APB上面.在实际的设计当中都是采用这样的方式连接多个APB slave的 DECODE4BIT - 可以理解为master接 ...

  10. 【一文秒懂】Ftrace系统调试工具使用终极指南

    [一文秒懂]Ftrace系统调试工具使用终极指南 1.Ftrace是什么 Ftrace是Function Trace的简写,由 Steven Rostedt 开发的,从 2008 年发布的内核 2.6 ...