iOS与Unity3d的交互实现
来源:互联网 发布:淘宝直通车怎么测图 编辑:程序博客网 时间:2024/05/21 17:38
iOS与Unity3d的交互实现
最近在公司写的项目是基于iOS与Unity3d的,之前也写了不少的iOS与Unity的项目,但是这次将两者结合开发还是第一次。项目的第一条功能需求就是:实现从iOS原生界面到Unity的跳转。
看似简单,但是却不知道怎么下手,修改Unity导出到iOS的封装好的代码是肯定的,但是至于改哪里,怎么改却是比较难。和一般的coding一样,一上来先是各种找解决方案和样例,不管是国内大神雨松momo的博客,还是墙外的社区都是搜刮了一番,运气挺好,在某岛国的博客中有人写了一种解决方案。链接戳这里:
https://github.com/mythosMatheWG/unityIntoIOSSample
这里提供的解决方案并没有给出完整的解释,原博主也只是一步步教你在哪里改代码,虽然能运行,但是却不知所以然。而且,这套解决方案有Bug,后来才知道:如果没有处理好ViewController与Unity之间的关系,会导致跳转到Unity之后出现如下错误:
- 1
然后你的Unity界面内容就糊掉了==!
——继续找,在另外一篇帖子里面看到了比较完整的另外一种解决方案,链接戳这里:
http://game.ceeger.com/forum/read.php?tid=20533
这篇博客的教程就是在这两种解决方案的基础上进行的。旨在提供一套”你跟着做了就能够实现”的较为完整的解决方案。当然,前提是我们假设你会Unity,iOS的一些基础知识
开发环境
- xcode 7.2
- Unity4.6.3 (这个无所谓,因为build出来的OC代码没有太大变化)
开发语言
- OC
正餐
先让了解一下Unity build出来的iOS工程项目的整个框架以及运行流程
Main.mm作为整个项目的入口主要做了如下的事情
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 初始化各个模块
- 将UnityAppController作为控制类来实现Unity在iOS上显示的功能,换句话说,就是在main之后紧接着就要执行这个类里面的函数
所以视线转移到UnityAppController.mm这里,可以看到这里的代码结构和OC的一般类的代码结构类似,除此之外还有一些C语言程序,作为相对底层中Unity与iOS交互的桥梁,不用管。我们需要关注的是:
UnityAppController.mm中函数执行的顺序以及我们能够在哪里加上我们自己的代码实现”项目入口”的修改,从而做到整个程序一上来先显示我们自己的View,然后通过自定义事件再来跳转到Unity部分。
所以整个项目看起来就像把Unity导出的工程剖开,将我们自定义的部分”塞”进去,从而实现iOS与Unity3d的交互。
操作步骤
1.修改项目入口
从运行项目看到的输出可以知道,UnityAppController.mm函数的执行顺序为:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
执行了StartUnity,会让Unity的界面就会显示出来。
如果要修改项目入口,让Unity界面显示之前先显示我们需要的界面,就需要
在StartUnity函数执行之前实现入口修改,当我们需要跳转到Unity部分的时候再调用StartUnity
通过继承我们可以利用子类来复写UnityAppController中的函数,从而实现入口修改。我这里的做法是,创建一个UnitySubAppDelegate类(因为其作用与一般iOS工程项目中的AppDelegate类似,所以这么叫),这个类是继承自UnityAppController,能够对其函数进行复写。在这里我对StartUnity函数复写:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
代码中可以看到,实现修改程序入口的本质就是对window进行修改:
- 将window指针传给自定义的VC
- 将自定义的VC作为当前window的rootViewController
进行这样的操作,程序就会在启动后跳转到我们自定义的View上了。
2.从自定义界面启动Unity
我们已经知道,启动Unity的函数是
- 1
那么在我们自定义的VC中我们就能利用这个方法实现从自定义界面启动Unity:
- 1
这里的appDelegate就是在步骤1中传过来的值,所以我们需要在当前VC的头文件中定义一个appDelegate:
- 1
3.从Unity界面返回自定义界面
返回自定义的方法有很多,我这里用的方法是在当前window的rootView上面加上一个button来实现跳转(这部分代码同样是加在自定义的VC中,我这里的实现思路是在startUnity函数调用之后就加上按钮)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
跳转实现函数为
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
之前我在找的第二个方案中提到的unity跳回自定义View方法是在Unity导出来的UnityAppController+ViewHandling.mm修改的。但是这样会挺麻烦,每次都要在项目导出后修改这部分代码。
4.从自定义界面跳转Unity
和步骤2不同,在Unity跳转回来后,Unity没有关闭,只是呈现挂起状态。所以Unity界面仍然存在,这也是我们为何在步骤3中需要把Unity界面保存在单例中。这里我们也只需要再进行一次界面跳转就能把Unity呈现出来:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
至此,iOS与Unity3d的交互就在这四个步骤中实现。说到底并不难,主要搞懂了几个界面的关系以及iOS的Window,rootView的层级结构就行。
项目文件
有任何问题及不足请指出
- iOS与Unity3d的交互实现
- iOS与Unity3d的交互实现
- unity3d 与 iOS 的交互
- Unity3d与iOS的交互
- Unity3d与iOS的交互(1)
- Unity3d与iOS的交互(2)
- Unity3d与IOS/Xcode的交互
- Unity3d与iOS的交互(1)
- unity3d与ios进行交互
- UNITY3D与iOS交互解决方案 [
- Unity3D与Android,iOS交互
- iOS与unity3D简单交互
- Unity3D与iOS的交互设计<ViewController 的跳转>
- unity3d for iOS Objective-C与JavaScript的交互
- iOS与unity3D交互整合的那些事
- Unity3D与iOS交互的两种方式
- unity3D与网页的交互
- unity3D与网页的交互
- 博客或论坛中 消息通知提醒 怎么实现的?
- 关于14道魔鬼js考题的整理
- 使用Volley框架
- 更新Xcode9后,tweak make失败
- 从浏览器输入网址到页面显示之间的过程
- iOS与Unity3d的交互实现
- canvas画多圈数据和点击下载事件
- #########好####### pyspark-Spark Streaming编程指南
- Tensorflow的常用矩阵生成
- 好大一波,波波都大#spring boot websocket单聊+群聊#
- post上传文件
- 数据库自学
- ACM常用处理技巧
- 使用Struts1.x实现用户登录实例