iOS随手分享iOS相关Unity跨平台技术分享

Unity3D工程并入iOS工程总结

2017-02-21  本文已影响1874人  2f37b96db822

基于客户项目的需求:开发做一个类似于暴风魔镜的产品。播放器部分是用Unity3D开发,其余内容管理和社交模块都是iOS原生开发,因此需要将unity3D工程跟原生工程合并, 本文是将unity3D导出的iOS代码并入到Xcode本地建的工程中。

解决思路:第一、先用Unity3D导出iOS代码工程;第二、把Unity3D导出的关键代码并入原生的iOS工程。该思路的优点在于集成之后,后期播放器代码升级基本不需要再动工程环境,只需要替换几个目录的文件即可实现,减少犯错机会和工作量。

第一部分, unity3D导出Xcode项目

1.打开你的unity工程,然后点击上边菜单栏file中的build settings

2. 接着会弹出一个框, 点击switch platform 选择iOS平台,然后点击弹框的player settings... 配置参数如下图,其中Auto Graphics API的配置非常重要,如果勾选了会导致集成之后播放器一直抖动!!!

4. 配置完成后点击build, 等待完成,这个过程需要较长时间,生成工程的代码结构

5.然后把上面两个红线框圈住的文件夹和文件拷贝到我们的iOS原生项目中,合并后目录如下

第一部分导出工程的工作已经完成,这部分比较简单, 接下来,我们就开始第二大部分,也是很容易出错的地方,尤其是配置需要注意.

第二部分, 把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)

注意:文件拖进工程的方式不完全一样,效果如下

5.添加framework(注意Optional的三个)

6.添加Header Search Paths和Library Search Paths

7.other C Flags -> -DINIT_SCRIPTING_BACKEND=1

8.添加User-Defined (UNITY_RUNTIME_VERSION版本号与导出工程的Unity版本号需要一致)

9.添加Run Script(这个需要注意,我们从Unity3D导出来的xcode工程里面就有这个脚本,配置成一样即可)

10.Other Linker Flags(注意添加的顺序,否则编译的时候可能出现链接库失败

11.把Unity/Classes/Prefix.pch的代码复制到新建的pch文件, 并把classes文件夹下的pch文件删除,注意:这里的删除并不是真正的删除源文件, 只是删除引用而已!并且如果原工程已经有pch文件,则把Unity/Classes/Prefix.pch的代码添加到ios原生工程的pch文件即可,如下图:

12. 将Classes/main.mm全部内容复制到main.m 并把扩展名改为.mm,注意里面红色框圈住的修改细节

13. 修改UnityAppController.h

14.在AppDelegate.h .m中添加如下代码

到这一步基本完成了ios对Unity的调用,下面是我在做的过程中遇到的一些问题.

1."Functions that differ only in their return type cannot be overloaded"

因为objc_msgSend calls做了严格检查,改成NO就可以了,修改如下图

2.提示函数返回值不匹配问题

原因是原生的工程配置了对函数返回值做严格检查,很不幸Unity3D导出的工程有些函数返回值并不规范,所以需要把xcode的配置限制放开,兼容返回值不匹配的场景

上面就是我把Unity3D工程并入iOS工程的过程了,在做这个项目的过程中还遇到一个坑,就是播放视频模式下需要保持横屏,但是其余页面是竖屏并且不自动旋转屏幕,下一篇再跟大家分享下我的解决方案

欢迎大家交流,转载请注明原地址!!!

上一篇 下一篇

猜你喜欢

热点阅读