程序丨Unity与iOS交互便捷指南_unity 获取ios弹出消息-程序员宅基地

技术标签: c#  xml  https  

早年间在Unity中接入平台相关的功能,如SDK,IAP,IAB,PUSH,WebView等等需要和原生组件交互的时候,就要应用到AndroidJavaClass和DllImport,后来的SDK在这方面做得越来越好,几乎不需要开发去手动的额外编写这部分的内容,但最近项目中几处需求有变,又需要用到这些。在这里先提供Unity与iOS交互的指南,之后再补充Android的部分。

iOS篇

在Unity当中,要调用iOS原生的代码,需要通过特性Attribute,[DllImport(__Internal")]

下面是Microsoft Docs定义:
 


只可以应用在方法上,指示该属性化方法由非托管动态链接库 (DLL) 作为静态入口点公开。

这是官方的解释,换句话说,应用了DllImport特性的方法,是由非拖管的第三方平台的语言来实现。

比如我现在要在Unity端写一个按钮,点击按钮后,调出iOS原生的Alert弹框,具体流程如下:

1.在Unity中新建一个脚本xxx.cs,并定义Alert弹框方法,比如:
 


这个方法必须是static extern进行修饰。因为要由非拖管的第三方平台来实现,所以我们加上特性Attribute。
 


(注:需要引入命名空间 using System.Runtime.InteropServices;)

2.我们做一个简单的按钮来直接的调用它。
 


这里要使用UNITY_IOS宏来进行平台的区分,相应的还有UNITY_ANDROID,我们直接传入string即可。

3.配置好Build Settings,导出Xcode工程,在导出的Xcode里,我们可以在Xcode工程结构的Classes或是Libraries下新建特定的类,并实现ShowAlertMessage方法。

这里我新建的类叫iOSWrapper,一般也命名为xxxImpl.h/mm。

4.首先新建iOSWrapper.h 头文件 。
 


这里我定义了UnityGameObject,可以忽略它,这是以前遗留的代码,主要是在使用UnitySendMessage时,用来定义GameObject的值,如果要声明其它OC的对象,也需要像这样来定义。
 


这是一个iOSWrapper类的成员方法,用于实现弹窗的创建和显示。
 


这是一个单例,你也可以动态的创建,我只是习惯将他们常驻内存以便随时使用。

5.实现iOSWrapper.h 头文件,我们需要卖二手手机平台创建一个iOSWrapper.m类,并引入头文件 。


在iOSWrapper类中,定义类的实例instance,并实现sharedInstance方法来创建单例。

showAlertMessage方法我们通过UIAlertView来实现弹出对话框。

(注:8.0以后,使用UIAlertController实现,UIAlertView被废弃,我这里目标平台是7.0,依然可以使用。)

另外,Unity端传递过来的字符串都是char数组,我们需要将它转换为OC的NSString,同样的,当我们需要从iOS传递字符串给Unity时,也需要将NSString转换为char数组,在Unity的官方中有封装了两个方法,后面会提供上来。

6.这一步,我们需要实现C#中[DllImport(__Internal")]应用的方法在原生中的实现。

这里*.m文件是默认支持OC和C代码的,如果我们需要支持C++,则需要将*.m修改为*.mm,并修改文件的Type为Objective-C++ Source.

我们也需要将[DllImport("__Internal")]应用的方法定义在extern "C"下,extern "C"是告诉编译器这些方法要以C的函数命名规则来编译和链接。

为何要使用"extern C"?

因为C++是支持多态的,比如函数重载,所以C++编译器中对函数的命名都是以方法名+参数类似的形式,比如void foo(int x,int y),C++编译器会产生foo_int_int之类的名字,而C语言不支持多态,不支持函数重载,命名规则就是函数名,那么,如果我不加以限定,默认以C++的函数命名规则时,在C++中调用C函数时,就会出现类似无法找到在obj模块中C函数定义,UnsatisfiedLinkError:xxx之类的异常。

通常只要不是通过C++来调用,extern "C"都不是必须要加的。

extern "C" 定义在在iOSWrapper.mm类的外部,即:
 


下面:
 


上面有提到过,Unity传递过来的字符串是char数组,我们需要将他转换成NSString。
 


在Unity官方的例子中对此做了封装,可以拿过来直接使用C风格字符串转换NSString。
 


相应的,下面是NSString字符串转换为C风格字符串。
 


这两个方法要定义到extern "C"的上面,因为C语言是面向过程的,如果定义在extern "C"的下面,会提示找不到函数。

字符串是Unity与平台之间交互最频繁的操作。

这样,在Unity端打开一个iOS原生弹窗的功能就实现了,此时要将编写完成的iOSWrapper.h和iOSWrapper.mm文件 ,拷贝到Unity->Plugins->IOS下,这样生成xcode工程时,就会拷贝到Xcode的Libraries目录下。

现在实现了Unity端调用iOS端原生的组件API(窗口),我如何从原生iOS端传递数据给Unity?

这里就要使用到UnitySendMessage。
 


三个参数:对象名,方法名,参数。

这里的对象名在我们当前Scene中Hierarchy下某个Obj,method方法名是Obj下绑定的xx脚本中的method,msg即是我们从平台端传递回来的参数,UnitySendMessage是iOS和Android通用的。

比如就以上面弹框为例,我们需要将弹框的内容再返回到Unity端,只需要这样:
 


Main就是我当前活动场景里的Obj,ReceiveMessage我们需要在xx脚本中进行定义:
 


(注:需要是非static方法)

这样就OK了,如果我要返回一个NSString的字符中,一定要通过MakeStringCopy转换成C风格的字符串转换才可以。(MakeStringCopy函数在上面有定义。)

还有,字符串拼接,可以使用NSString的format。
 


或者由纯C实现:
 


这里的_strlen是一个封装好的函数。
 


因为C风格字符串默认最后一位是'\0',占一位,所以长度要+1。

如果在Unity端想要直接返回string,在xx脚本定义如下:
 


在iOSWrapper.mm的extern "C"下实现:


 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/august5291/article/details/120359454

智能推荐

Navicat的下载安装_navcat 驱动在哪-程序员宅基地

文章浏览阅读128次。下载Navicat下载地址http://www.navicat.com.cn/download/navicat-premium安装Navicat双击exe文件,一步一步安装即可安装成功后打开如下图_navcat 驱动在哪

VS2015+Qt5.10.0安装-程序员宅基地

文章浏览阅读6.7k次。好,开写我的第一个blog。首先,你需要下载安装vs2015和qt5.10.0:下载 VS2015 (官网已经下载不到了)下载之后可以解压然后打开vs_community.exe,也可以加载至虚拟光驱打开。之后安装过程我就不说了(大约需要几个小时)。qt5.10.0可以访问清华大学镜像https://mirrors.tuna.tsinghua.edu.cn/qt/,之后依次打开official_r..._vs2015+qt5.10

最新版大厂字节跳动笔试题(含答案)-程序员宅基地

文章浏览阅读1.3w次。字节跳动测试工程师笔试题1、阶段评审与同行评审的区别?参考答案:同行评审目的:发现小规模工作产品的错误,只要是找错误;阶段评审目的:评审模块 阶段作品的正确性 可行性 及完整性同行评审人数:3-7 人 人员必须经过同行评审会议的培训,由 SQA 指导阶段评审人数:5 人左右 评审人必须是专家 具有系统评审资格同行评审内容:内容小 一般文档 < 40 页, 代码 < 500 行阶段评审内容: 内容多,主要看重点同行评审时间:一小部分工作产品完成阶段评审时间: 通常是设置在关键路_字节跳动笔试

统计学习方法——逻辑斯蒂回归模型_二值逻辑斯谛回归模型-程序员宅基地

文章浏览阅读2k次,点赞2次,收藏14次。1. 写在前面本文主要针对一个简单的机器学习算法逻辑斯蒂回归模型进行相关的讲解。主要内容包括:逻辑斯蒂回归模型定义及来源、二项逻辑斯蒂回归模型形式与推导、二项逻辑斯蒂回归模型的参数估计与多项逻辑斯蒂回归模型推广。2. 逻辑斯蒂回归模型定义及来源逻辑斯蒂回归模型主要是来源于逻辑斯蒂分布与逻辑斯蒂函数。当然,如果换一个名字,你对它应当相当熟悉,那就是sigmoid函数。它的形式如下: ..._二值逻辑斯谛回归模型

【转】漫谈iOS程序的证书和签名机制-程序员宅基地

文章浏览阅读82次。转自:漫谈iOS程序的证书和签名机制接触iOS开发半年,曾经也被这个主题坑的摸不着头脑,也在淘宝上买过企业证书签名这些服务,有大神都做了一个全自动的发布打包(不过此大神现在不卖企业证书了),甚是羡慕和崇拜。于是,花了一点时间去研究了一下iOS这套证书和签名机制,并撰文分享给需要的朋友。由于本人才疏学浅,多有遗漏或错误之处,还请大神多多指教。非对称加密和摘要非对称加密的特性和用法..._0:d=0 hl=2 l= 3 prim: object :x509v3 certificate policies

Tensorflow小技巧整理:tf.trainable_variables(), tf.all_variables(), tf.global_variables()的使用-程序员宅基地

文章浏览阅读1.6k次。tf.trainable_variables(), tf.all_variables(), tf.global_variables()查看变量在使用tensorflow搭建模型时,需要定义许多变量,例如一个映射层就需要权重与偏置。当网络结果越来越复杂,变量越来越多的时候,就需要一个查看管理变量的函数,在tensorflow中,tf.trainable_variables(), tf.all_variables(),和tf.global_variables()可以来满足查看变量的要求,来简单说一下他们的不_tf.trainable_variables()

随便推点

IDEA中Node.js环境下npm报错Error:0308010C:digital envelope routines:unsupported_:digital envelope routines::unsupported-程序员宅基地

文章浏览阅读3.5k次。Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 是一个开源的、跨平台的 JavaScript 运行时环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。Node.js 的包管理器 npm,是目前最流行的Node.js 的包管理器。_:digital envelope routines::unsupported

javax-validation 后台参数验证的使用详解_javax.validation maven-程序员宅基地

文章浏览阅读2.1k次。一、前言在后台开发过程中,对参数的校验成为开发环境不可缺少的一个环节。比如参数不能为null,email那么必须符合email的格式,如果手动进行if判断或者写正则表达式判断无意开发效率太慢,在时间、成本、质量的博弈中必然会落后。所以把校验层抽象出来是必然的结果,下面说下几种解决方案。二、几种解决方案1、struts2的valid可以通过配置xml,xml中描述规则和返回的信息,这种方式比较麻烦、开发效率低,不推荐2、validation bean 是基于JSR-303标准开发出来的,使用注_javax.validation maven

eclipse SVN插件1.6x,1.8x,1.10x下载地址_eclipse svn1.8下载-程序员宅基地

文章浏览阅读238次。Subclipse 1.6.x includes and requires Subversion 1.6.x client features and working copy format.Subclipse 1.8.x includes and requires Subversion 1.7.x client features and working copy format.S..._eclipse svn1.8下载

Mac中electron项目打包时/Library/Caches/electron/411720686.zip.part4: permission denied的问题_sh: 1: electron-builder: permission denied-程序员宅基地

文章浏览阅读890次。electron项目打包时遇到/Library/Caches/electron/411720686.zip.part4: permission denied的问题_sh: 1: electron-builder: permission denied

【kkFileView】源码编译打包构建镜像部署_kkfileview使用源码构建镜像-程序员宅基地

文章浏览阅读839次。文件地址: https://xxx.com/web/入职培训.pdf把文件地址进行base64编码:再进行urlEncode:然后再传给预览服务:在浏览器打开这个地址就可以正常预览了。_kkfileview使用源码构建镜像

浅析RedHat Linux下中文包、中文输入法的安装_红帽的输入法在文件中叫什么名称-程序员宅基地

文章浏览阅读3.2w次。使用VMware安装redhat 5时未将中文包安装上,所以现在的中文全是麻将类的方块,如何解决全英文无法显示汉字和输入汉字这一问题,接下来就知道啦…将系统光盘镜像文件连接至计算机,我的镜像是RHEL5.1的,先将光盘挂载至/mnt目录下,然后切换到/Server目录下,安装两个中文包: fonts-chinese-3.02-12.el5.noarch.rpm fonts-ISO885_红帽的输入法在文件中叫什么名称