Unity与IOS交互,调用IOS系统相机和相册

时间:2024-03-26 08:24:15

前面两篇总结了一下unity与android的简单交互和调用安卓系统相机和相册,比较蛋疼的是,后来发现不同的测试机上会有不同的bug。。。下阶段要一个一个的解决一下


今天总结一下与IOS的交互。这次我会跳过ios单独的调用相机和相册的讲解,因为我对IOS不专业,讲不好,如果有需要的可以直接从网上搜,比我讲的专业。我主要说一下unity和IOS交互的问题。本来这个问题网上也是有很多帖子讲的(虽然基本上都是抄过来抄过去的),但是我在做的过程中还是遇到了一些大牛没有讲到的东西,所以,我觉得还是有必要再讲解一下,把我自己遇到的问题和解决的方式总结一下。


与IOS的交互,在步骤上要比android简单许多,不会产生因为系统版本,或者包名导致的许多问题。过程中最头疼的一个问题是IOS回调Unity,很简单的一个问题,搞了半天。不管是ios还是android,要调用unity中的方法,都是通过UnitySendMessage()方法,Android是引入class.jar包,在包中包含这个方法,但IOS中怎么引入这个函数呢,网上查了半天没有头绪...原来是unity跟IOS交互的基本方式没搞明白,最核心的步骤是这样的:


1,在unity中新建一个项目

2,然后打包成xcode项目

3,在Xcode中进行编辑

4,把添加的*.mm文件和*.h文件添加到unity原始项目的plugins文件夹下


下面进入正题,开始撸代码。

首先新建一个unity项目,搭建一个界面,界面上有两个button和一个显示图片用的texture。新建一个cs脚本:


Unity与IOS交互,调用IOS系统相机和相册

其中需要重点说一下的是第3行和第11-14行。第三行是为了引入DllImport方法,第11-14行是引入在xcode中定义的两个方法,这两个方法会在后面讲到。格式就是这样的,你能修改的只有函数名。


Unity与IOS交互,调用IOS系统相机和相册


很简单的三个方法。分别是打开摄像机,打开相册,和IOS回调Unity。


第二步,打包成Xcode工程。

然后,新建一个*.m文件和*.h文件,我的习惯命名为UnityTest.m和UnityTest.h。

.h是头文件,文件内容如下:


Unity与IOS交互,调用IOS系统相机和相册

要引入头文件<QuartzCore/CACisplayLin.h>,因为UnitySendMessage()方法定义在这里面...

还需要继承UIViewController类和后面的两个接口。父类是为了进入IOS界面,接口是打开相机用的。


下面是.m文件的内容:


Unity与IOS交互,调用IOS系统相机和相册

OpenTarget方法的 type 参数是为了区分,打开的是摄像机还是相册。 这个方法里是对打开参数的一些设定,还有其他的一些参数也是在这里进行设定。最后 一句是具体执行打开相机或者相册的代码。这里不需要关心裁剪的问题,拍完照或者选择好照片后会自动进入裁剪界面。


操作完成确定后IOS内部的回调方式如下:


Unity与IOS交互,调用IOS系统相机和相册


这个方法是自动调用的,如果是有进行录像,还需要在这个方法里判断一下info参数的内容,因为我这里只是取图片,所以就省略了这一步。

在这个方法里要对图片进行保存,下面是执行保存的方法:


Unity与IOS交互,调用IOS系统相机和相册

以上第一个是获取保存路径,第二个是具体的保存文件的方法,在这里保存的时候是把图片首先转换成了二进制数据。


摄像机和相册的取消选项的回调函数声明如下:


Unity与IOS交互,调用IOS系统相机和相册

这里直接反馈给Unity,传回的参数为“”。


下面进入最后一步。声明供unity调用的方法。unity能够调用的两个方法,按下面的格式进行声明(还是在.m文件中):


Unity与IOS交互,调用IOS系统相机和相册


extern "C"是固定语法,据说这是C++的东西,所以,.m文件的后缀必须改成.mm,这样才能进行语法支持。


因为对OC的语法并不是很熟悉,所以具体每行代码的意思就不仔细说了,怕误人子弟,大家有不懂的直接网上查吧。其实个人觉得这里面也没什么很晦涩的代码,联系上下文自己理解一下,即便是不懂OC也理解个差不多。


说一个自己犯的低级错误:在xcode的调试信息中打印了一句SendMessage:object getImage not found!表现出来的症状就是回掉unity后,图像没有加载出来...
问题的原因是UnitySendMessage()方法的第一个参数,是接收ios回掉信息的那个类所挂载的物体。而我...没有声明这个对象,直接挂到了摄像机上...


文章原地址https://blog.csdn.net/u010133610/article/details/51533434