iOS与unity3D交互整合的那些事

一.小记

最近公司有个需求,需要用unity3D建立3D模型,并且实现切换功能,由于做开发时间不算长,又没有接触过unity3D, 所以只能一头雾水去网上查找资料,也看了雨松MOMO的文章,不过都是几年前的了,有些东西已经不适用了,只能边看边研究,今天终于有点眉目了,可以在unity3D导出的iOS工程文件的基础上,对3D建模的页面进行修改,并能够执行一些操作了。

二.实现细节

unity3D 版本: 5.3.4

Xcode    版本: 7.3.1

首先就是需要做unity3D的人员将相应的模型上绑定好脚本,并告知你模型或者说要操作的对象的名称和要调用的方法名称,这里由于我要实现的是切换摄像机的角度,所以名称为mycamera(我希望是驼峰命名myCamera,可惜unity3D那边不是我写的,就不要在意这些细节了,自己注意就好),导出的时候在playerSetting中做好各种设置,选择使用模拟器调试、SDK版本什么的,这里就不赘述了。

导出的包如果是压缩后传过来的,那么解压后需要稍等一会才能看见文件夹中的xcodeproj文件,不知道什么原因可能是文件太大了吧......

打开xcodeproj文件,首先编译一下试试,很大可能报一个错误

编译报错

意思是说MapFileParser.sh文件没有权限执行,这样我们进入中端,给予这个文件权限

给MapFileParser.sh权限

这样,报错就能够成功解决了,再次运行就会出现没有加工处理过的原生的unity3D的内容了

比如像这个杯子的3D模型

文件能正常编译运行,我们就可以进行下一步了。

我们在导出的工程中自己添加文件MyViewInit

添加自己的文件

在文件中写入自己想要实现的代码

MyViewInit.h


MyViewInit.m
MyViewInit.m

当一个简单的界面搭建好之后,我们就要先测试一下是否能够添加到U3D模型界面,在工程文件夹中找到Classes文件夹,点击展开,找到UnityAppController.mm文件,该文件是U3D工程的启动文件

找到UnityAppController.mm文件

在文件的最上部分,导入自己写的文件的头文件

#import "MyViewInit.h"

找到方法

didFinishLaunching

在方法最底部添加布置UI的代码

布置UI

其中UnityGetGLViewController() 是U3D模型视图中的根视图控制器

(如果在老版本的unity3D中可能需要对此进行更改)

然后就可以点击运行进行测试了,不出什么意外的话,就可以显示在模型视图上了

添加UI控件后的视图

怎么样,效果立竿见影吧!

下面进行最重要的一步,向U3D模型发送消息,回到MyViewInit.m文件,为两个button添加的点击事件完成实现,别忘了在.h文件声明

实现button点击事件

为了防止发生小意外找不到错误,可以先在这里打印,看看按钮是否响应点击事件,如果能成功打印,那就万事大吉了。


这里要着重说一点,雨松MOMO在他的一篇文章中讲述了这方面的内容,他使用的是继承自UIViewController的文件,并使用对象方法来写UI和点击事件,不知道为什么,添加的UI空间可以显示,但是button不响应点击事件,我还暂时没有深究原因,待后续更新。


在点击事件中,使用U3D已经写好的方法

UnitySendMessage("mycamera", "changeModel", "");

第一个参数 填写接受方法的物品或者模型名称。

第二个参数 填写方法名字。

第三个参数 填写要穿的参数,没有要传的参数直接写"",这里不能写nil,会crash。

这样再次运行,就可以啦,我这里实现的是点击按钮切换模型

切换模型

后续还会将此工程嵌入到已完成的iOS项目中进行整合,我还会继续更新!


----------------------------------------------------------------------------------------------------

2017年03月10日09:49:20  更新

----------------------------------------------------------------------------------------------------

有很多朋友会问,自己添加的点击事件不响应,实例方法不响应,但是类方法却响应。这里其实是在程序运行的时候,你所添加button的视图控制器被U3D的系统方法替换掉了,导致按钮被释放,所以肯定也不会有事件响应了,下图注释的部分就是U3D系统替换你的ViewController的方法。


U3D系统方法会换掉你的控制器


所以想要保证视图控制器不被释放,在创建的时候要加一个static即可解决。




欢迎支持

我的新浪微博:任性的驴

欢迎关注!!!

推荐阅读更多精彩内容