Unity3D工程并入iOS工程总结
基于客户项目的需求:开发做一个类似于暴风魔镜的产品。播放器部分是用Unity3D开发,其余内容管理和社交模块都是iOS原生开发,因此需要将unity3D工程跟原生工程合并, 本文是将unity3D导出的iOS代码并入到Xcode本地建的工程中。
解决思路:第一、先用Unity3D导出iOS代码工程;第二、把Unity3D导出的关键代码并入原生的iOS工程。该思路的优点在于集成之后,后期播放器代码升级基本不需要再动工程环境,只需要替换几个目录的文件即可实现,减少犯错机会和工作量。
第一部分, unity3D导出Xcode项目
1.打开你的unity工程,然后点击上边菜单栏file中的build settings
![](https://img.haomeiwen.com/i4754383/59a799522813b85a.png)
2. 接着会弹出一个框, 点击switch platform 选择iOS平台,然后点击弹框的player settings... 配置参数如下图,其中Auto Graphics API的配置非常重要,如果勾选了会导致集成之后播放器一直抖动!!!
![](https://img.haomeiwen.com/i4754383/d04b73d15f72b3ac.png)
4. 配置完成后点击build, 等待完成,这个过程需要较长时间,生成工程的代码结构
![](https://img.haomeiwen.com/i4754383/9c3b339774bc43cc.png)
5.然后把上面两个红线框圈住的文件夹和文件拷贝到我们的iOS原生项目中,合并后目录如下
![](https://img.haomeiwen.com/i4754383/b8c1e7e03367d1e4.png)
第一部分导出工程的工作已经完成,这部分比较简单, 接下来,我们就开始第二大部分,也是很容易出错的地方,尤其是配置需要注意.
第二部分, 把Unity3D导出的关键代码并入原生的iOS工程
1.Unity导出的工程中的bundleId要和你本地iOS项目的id一致
2.修改bit code为NO
3.删除Main.storyboard,代码设置控制器(方便切换window,其实也可以不删除)
4.将Classes,Libraries,MapFileParser.sh拖入到项目(选中Copy items if needed,选中Create groups)
将Data拖入到项目(选中Copy items if needed,选中Create folder references)
注意:文件拖进工程的方式不完全一样,效果如下
![](https://img.haomeiwen.com/i4754383/3ae1b6abcc4bb573.png)
5.添加framework(注意Optional的三个)
![](https://img.haomeiwen.com/i4754383/76e6e34a9f5a139e.png)
6.添加Header Search Paths和Library Search Paths
![](https://img.haomeiwen.com/i4754383/128f5b345a35141c.png)
![](https://img.haomeiwen.com/i4754383/27b9d97307656745.png)
7.other C Flags -> -DINIT_SCRIPTING_BACKEND=1
![](https://img.haomeiwen.com/i4754383/f1b87a6ad127573c.png)
8.添加User-Defined (UNITY_RUNTIME_VERSION版本号与导出工程的Unity版本号需要一致)
![](https://img.haomeiwen.com/i4754383/f3de4f4f92ef006c.png)
9.添加Run Script(这个需要注意,我们从Unity3D导出来的xcode工程里面就有这个脚本,配置成一样即可)
![](https://img.haomeiwen.com/i4754383/75e9a526451c201f.png)
10.Other Linker Flags(注意添加的顺序,否则编译的时候可能出现链接库失败)
![](https://img.haomeiwen.com/i4754383/7348f32718fce222.png)
11.把Unity/Classes/Prefix.pch的代码复制到新建的pch文件, 并把classes文件夹下的pch文件删除,注意:这里的删除并不是真正的删除源文件, 只是删除引用而已!并且如果原工程已经有pch文件,则把Unity/Classes/Prefix.pch的代码添加到ios原生工程的pch文件即可,如下图:
![](https://img.haomeiwen.com/i4754383/84560aada5282a6a.png)
12. 将Classes/main.mm全部内容复制到main.m 并把扩展名改为.mm,注意里面红色框圈住的修改细节
![](https://img.haomeiwen.com/i4754383/df3a0c0bc08a05e3.png)
13. 修改UnityAppController.h
![](https://img.haomeiwen.com/i4754383/40b34c559aa34b66.png)
14.在AppDelegate.h .m中添加如下代码
![](https://img.haomeiwen.com/i4754383/2d10a2cecc5c086f.png)
![](https://img.haomeiwen.com/i4754383/ed7ffbbbd7c8a568.png)
![](https://img.haomeiwen.com/i4754383/0e2ee75fe120bb3b.png)
到这一步基本完成了ios对Unity的调用,下面是我在做的过程中遇到的一些问题.
1."Functions that differ only in their return type cannot be overloaded"
![](https://img.haomeiwen.com/i4754383/7a8d80770c07a612.png)
因为objc_msgSend calls做了严格检查,改成NO就可以了,修改如下图
![](https://img.haomeiwen.com/i4754383/386a1b4b77df720d.png)
2.提示函数返回值不匹配问题
![](https://img.haomeiwen.com/i4754383/22debc902654ad25.png)
原因是原生的工程配置了对函数返回值做严格检查,很不幸Unity3D导出的工程有些函数返回值并不规范,所以需要把xcode的配置限制放开,兼容返回值不匹配的场景
上面就是我把Unity3D工程并入iOS工程的过程了,在做这个项目的过程中还遇到一个坑,就是播放视频模式下需要保持横屏,但是其余页面是竖屏并且不自动旋转屏幕,下一篇再跟大家分享下我的解决方案
欢迎大家交流,转载请注明原地址!!!