unity与iOS合并

关于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

unity与iOS合并_第1张图片
准备导出开始


- 1.2 然后在弹框出来,如果当前默认不是iOS平台就切换到iOS平台。确认平台以后就点击player setting按钮,进入具体的配置界面。

unity与iOS合并_第2张图片
平台切换

- 1.3 进入具体设置Other Settings,图上面画的就是设置的东西,il2cpp这个不要忘了设置,还有运行方式,最低版本支持。设置完成直接building导出。

unity与iOS合并_第3张图片
基本配置

- 还有一个问题就是游戏开发的时候(虽然我不是做游戏开发的)的可能会碰到关于AOT的问题,其实就是在这个位置设置好就行了,具体的网上都有,直接搜索AOT引起的crash就找得到,虽然没解决我的问题。

unity与iOS合并_第4张图片
AOT-crash


2,开始进行导入工程前的准备

打开unity已经导出的工程,看看里面的库是否是支持目前版本的库,然后再运行一下,基本是不会出问题的。如果出现错误的话应该是需要把encode设置为no,还有在building setting上设置新的编译参数

unity与iOS合并_第5张图片
添加设置

如果unity导出的工程可以完整的在模拟器或者真机上运行,那么这个导出的工程上的配置就是对的,然后可以在需要导到目标工程里面进行copy UNITY里面的设置。

3,开始导入unity工程


unity与iOS合并_第6张图片
选中需要用的资源文件

- 3.1 在unity导出的工程中,选中这些资源文件,并将其拷贝到目标工程所在目录

unity与iOS合并_第7张图片
拷贝到目标工程所在目录

- 3.2然后打开目标工程,开始添加文件引用,添加的方式不一样,Class和Libraries文件夹用Create Groups,而Data用Create folder.. ,不要选错

unity与iOS合并_第8张图片
unity与iOS合并_第9张图片
添加后的样子

这个大家要注意啊::::!!!!


# Classes 的 Native在移到工程中的时候可能会缺少部分文件,Classes文件从导出的工程复制粘贴到自己的项目会少文件,这个很坑。

新版的的 unity 好像没有 MapFileParser 这个文件,这没关系的。



4 添加完成后,开始删除一部分引用( 不是直接删除啊 ),后面所有的删除都是删除引用。

###(新版本不删除引用!!!(我后面用的5.5.1f1))

- 4.1先删除引用libraries里面的libil2cpp文件夹,然后再删除Classes里面的Native文件夹里面的所有.h文件

unity与iOS合并_第10张图片
.h删除

 - 4.2然后再将classes里面的main.mm文件内容全部拷到自己原有的main.m文件中再删除引用,并将AppControllerClassName后面修改成AppDelegate,自己修改 main.m->main.mm。将.pch文件里面的东西放到自己的pch文件中或者就用它的也可以,并添加#import"UnityAppController.h",但是pch文件路径别忘了添加。

unity与iOS合并_第11张图片
pch文件
unity与iOS合并_第12张图片
修改main.mm

- 4.3如果出现一些运行报错那就把//UIApplicationMain(argc, argv, nil, [NSString stringWithUTF8String:AppControllerClassName]);替换掉。

- 4.4然后就是点击工程进入设置界面,主要设置的地方有三个,怎么设置参考导出的unity工程。。。

位置

第一个主要是库的添加,第二个是一系列的配置,最好要完全copy里面的设置(看清楚瞪大眼睛,里面的引用资源路径别写错了啊)简略的写写,照着unity导出的工程配置就可以了。


unity与iOS合并_第13张图片
资源路径


unity与iOS合并_第14张图片
这个一定要有的

第三个是一个run


unity与iOS合并_第15张图片
添加run


- 4.5这样配置完了,command+b编译时在 UnityAppViewcontroller 里面应该会出现不识别UnityViewControllerBase,把它直接改成UIViewController。

然后在AppDelegate中添加


unity与iOS合并_第16张图片
AppDelegate.h


unity与iOS合并_第17张图片
AppDelegate.m


unity与iOS合并_第18张图片
.m

- 4.6这里写完后在UnityAppController.h里面修改


unity与iOS合并_第19张图片
修改UnityAppController

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 内存太大问题解决方案

代码如下:

unity与iOS合并_第20张图片


报错问题:

 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报错

unity与iOS合并_第21张图片
unity与iOS合并_第22张图片
报错详情

      》解决办法: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

你可能感兴趣的:(unity与iOS合并)