集成Unity3D到iOS应用程序中

来源: 博客园


(资料图)

如果想让原生平台(例如 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作用域设置成public5.构建UnityFramework工程,生成静态库6.把UnityFramework静态库导入到iOS工程中,同时在General-Libaray,Frameworkd设置成Embed&SignUnity3D与iOS原生交互Unity3D调iOS1.在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_IPHONEoutputAppendString("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.htmlhttps://juejin.cn/post/6844903933790388231https://blog.51cto.com/myselfdream/2559580https://blog.51cto.com/myselfdream/2559599https://blog.csdn.net/weixin_42714258/article/details/122454019
相关新闻
集成Unity3D到iOS应用程序中

如果想让原生平台(例如Java Android、ObjectiveC iOS或WindowsWin32 UWP)包含Unity功能,可以通过Unity生成UnityFramework静

百度健康与广州东方略达成战略合作

电商报快讯:4月7日消息,百度健康日前与广州东方略生物科技有限公司签署战略合作协议,双方将建立长期战略合作伙伴关系。据介绍,阿东“液体

CCTD:北港库存再创新高

  本周,恰逢清明假期,港口市场交易氛围较为平淡。周初市场观望情绪较浓,均等待进一步指引,价格整体维持稳定。但大企业外购价格连续多期

竞技观察丨中职篮,期待越赛越精彩

原标题:2022—2023赛季常规赛结束,季后赛将于4月9日开始(引题) 中职篮期待越赛越精彩(竞技观察)(主题)人民日报记者范佳元核心阅读对