关于unity导出工程与已有iOS工程合并网上面已经有很多的教程,但是还是要记录一下自己的经历过程。从最基本的说明,面对刚接触unity的小白,力求大家看到过后一次性合并成功。所用unity版本5.3.5p8(没什么关系),xcode版本7.3.1
再说一遍新版的 unity 和 xcode 不需要删除下面说的一些文件引用。直接引用就好了,而且好像也没办法批量删除部分文件引用。😁(unity 2017版的没试过)
看到很多人问我怎么配置不成功啊,这里、那里错❌。我都晕了,现在说一下啊,我上面已经全说了,再配置不成功的话,可以参开我的 配置demo,里面的 unity 文件我已经移除,下载过来以后要按照要求将你的 unity 文件移进去,并修改少量代码,就可以了,报错的话下面有部分解决方案。(新版最好直接将之前的文件删除(删到垃圾推里),重新添加文件)
配置下载链接这个是我的网盘链接链接,大家可以下载,我也传到cocoachina 上面了,不过要审核。
1,怎么导出unity的iOS工程
- 1.1首先在unity打开unity工程,然后点击file->buld setting
- 1.2 然后在弹框出来,如果当前默认不是iOS平台就切换到iOS平台。确认平台以后就点击player setting按钮,进入具体的配置界面。
- 1.3 进入具体设置Other Settings,图上面画的就是设置的东西,il2cpp这个不要忘了设置,还有运行方式,最低版本支持。设置完成直接building导出。
- 还有一个问题就是游戏开发的时候(虽然我不是做游戏开发的)的可能会碰到关于AOT的问题,其实就是在这个位置设置好就行了,具体的网上都有,直接搜索AOT引起的crash就找得到,虽然没解决我的问题。
2,开始进行导入工程前的准备
打开unity已经导出的工程,看看里面的库是否是支持目前版本的库,然后再运行一下,基本是不会出问题的。如果出现错误的话应该是需要把encode设置为no,还有在building setting上设置新的编译参数
如果unity导出的工程可以完整的在模拟器或者真机上运行,那么这个导出的工程上的配置就是对的,然后可以在需要导到目标工程里面进行copy UNITY里面的设置。
3,开始导入unity工程
- 3.1 在unity导出的工程中,选中这些资源文件,并将其拷贝到目标工程所在目录
- 3.2然后打开目标工程,开始添加文件引用,添加的方式不一样,Class和Libraries文件夹用Create Groups,而Data用Create folder.. ,不要选错
这个大家要注意啊::::!!!!
# Classes 的 Native在移到工程中的时候可能会缺少部分文件,Classes文件从导出的工程复制粘贴到自己的项目会少文件,这个很坑。
新版的的 unity 好像没有 MapFileParser 这个文件,这没关系的。
4 添加完成后,开始删除一部分引用(不是直接删除啊),后面所有的删除都是删除引用。
###(新版本不删除引用!!!(我后面用的5.5.1f1))
- 4.1先删除引用libraries里面的libil2cpp文件夹,然后再删除Classes里面的Native文件夹里面的所有.h文件
- 4.2然后再将classes里面的main.mm文件内容全部拷到自己原有的main.m文件中再删除引用,并将AppControllerClassName后面修改成AppDelegate,自己修改 main.m->main.mm。将.pch文件里面的东西放到自己的pch文件中或者就用它的也可以,并添加#import"UnityAppController.h",但是pch文件路径别忘了添加。
- 4.3如果出现一些运行报错那就把//UIApplicationMain(argc, argv, nil, [NSString stringWithUTF8String:AppControllerClassName]);替换掉。
- 4.4然后就是点击工程进入设置界面,主要设置的地方有三个,怎么设置参考导出的unity工程。。。
第一个主要是库的添加,第二个是一系列的配置,最好要完全copy里面的设置(看清楚瞪大眼睛,里面的引用资源路径别写错了啊)简略的写写,照着unity导出的工程配置就可以了。
第三个是一个run
- 4.5这样配置完了,command+b编译时在 UnityAppViewcontroller 里面应该会出现不识别UnityViewControllerBase,把它直接改成UIViewController。
然后在AppDelegate中添加
- 4.6这里写完后在UnityAppController.h里面修改
5,启动unity界面了
- 在需要启动的界面调用
#进入调用。
[(AppDelegate*)[UIApplicationsharedApplication].delegate showUnityWindow];//启动
UnityPause(false);
#退出调用。(退出时用 unity 内部自己写的脚本调用外部自定义的 C 方法,将下面的代码放进去。不会的话就去搜!!!)
[(AppDelegate*)[UIApplicationsharedApplication].delegate hideUnityWindow];//隐藏
UnityPause(true);
就可以启动unity了。
添加一个陀螺仪脚本,使用这个脚本后在unity 里面有很棒的效果,制作的 GIF 图看着有点卡,其实很流畅的哦:
写到最后终于写完了,主项目里面的设置要参考unity导出的工程设置。
启动问题:
因为加载方式的原因,导致APP 整体启动速度较慢,内存峰值上升较快,所以设置了自己主动触发 unityController 的启动。这次改动是将之前在 didFinishLaunching里面的启动代码放到 showUnityWindow里面,其他保持不变。目前 unity 资源占用问题让 unity 工程师做,加载空的 unity 场景增加内存只有15M 左右(已测试,退出时切换到空的场景可以大幅减少占用内存),另外压缩图片大小可以大度降低内存占用量。
解决 unity 内存占用问题也可以参考:Unity 3D 内存太大问题解决方案
代码如下:
报错问题:
1,一些 cpp 文件之类的找不到,应该是资源路径不对,或者文件丢失,去 finder 里面看一哈。
2,Functions that differ only in their return type cannot be overloaded
》解决办法:把Enable Strict Checking of objc_msgSend Calls改为NO
3,__weak typeof(self)wSelf = self报错:- A parameter list without types is only allowed in a function definition. A corresponding warning tells me that __weak only applies to Objective-C object or block pointer types;type here is 'int'
》解决办法:Xcode-> Build Settings-> C Language Dialect修改配置,C99改为GNU99,C99是不包含typeof的
4,cString报错
》解决办法:Setting "Always Search User Paths" to "No" in the project settings fixed the build issues.
5,dyld: Symbol not found: _AbstractEventData_Reset_m15186946类似于这种错误
》 1):我是之前融合了简单的unity导出工程OK的情况下,再次融合新版的导出工程时报的错误(我的再次融合方式是,直接替换之前导入的资源文件),可能是工程里面引用到的某个方法或者文件和之前的不同,所以简单的替换资源文件导致出现的dyld: Symbol not found错误情况,大家如果出现这种错误可以试试,不需要更改之前的配置,只需要删除之前老的资源文件(在 xcode 里面删除引用),重新引入最新的资源文件。
》2):可能是一些资源Framework设置不是optional
后期添加的:只能帮到这了,毕竟我也好久没在做这方面的了。
- 其他整合交互方案看-》www.jianshu.com/p/db88ffd57168
- 如果遇到动画消失-》www.jianshu.com/p/baabd47434ca
- 如果实用 easyAR 遇到黑屏-》www.jianshu.com/p/f98bcfe09dc7