关于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就找得到,虽然没解决我的问题。
AOT-crash2,开始进行导入工程前的准备
打开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文件
.h删除- 4.2然后再将classes里面的main.mm文件内容全部拷到自己原有的main.m文件中再删除引用,并将AppControllerClassName后面修改成AppDelegate,自己修改 main.m->main.mm。将.pch文件里面的东西放到自己的pch文件中或者就用它的也可以,并添加#import"UnityAppController.h",但是pch文件路径别忘了添加。
pch文件 修改main.mm- 4.3如果出现一些运行报错那就把//UIApplicationMain(argc, argv, nil, [NSString stringWithUTF8String:AppControllerClassName]);替换掉。
- 4.4然后就是点击工程进入设置界面,主要设置的地方有三个,怎么设置参考导出的unity工程。。。
位置第一个主要是库的添加,第二个是一系列的配置,最好要完全copy里面的设置(看清楚瞪大眼睛,里面的引用资源路径别写错了啊)简略的写写,照着unity导出的工程配置就可以了。
资源路径 这个一定要有的第三个是一个run
添加run- 4.5这样配置完了,command+b编译时在 UnityAppViewcontroller 里面应该会出现不识别UnityViewControllerBase,把它直接改成UIViewController。
然后在AppDelegate中添加
AppDelegate.h AppDelegate.m .m- 4.6这里写完后在UnityAppController.h里面修改
修改UnityAppController5,启动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
网友评论
FinalDemo was compiled with optimization - stepping may behave oddly; variables may not be available.
-> applicationDidFinishLaunching()这个奔溃怎么处理
FinalDemo was compiled with optimization - stepping may behave oddly; variables may not be available.
-> applicationDidFinishLaunching()这个奔溃怎么处理
clang: error: linker command failed with exit code 1 (use -v to see invocation) ,按照你的步骤一模一样来的~~
顺便问一下,如何关闭unity3d ios工程输出日志?
顺便问一下,如何关闭unity3d ios工程输出日志?
ld: warning: arm64 function not 4-byte aligned: _unwind_tester from /Users/mac/Desktop/907/MojingAssistantIOS/Classes/Vender/Libraries/libiPhone-lib.a(unwind_test_arm64.o)
Undefined symbols for architecture arm64:
"_HideUnityWindow", referenced from:
_UIMainControl_HideUnityWindow_m1141355708 in Bulk_Assembly-CSharp_0.o
(maybe you meant: _UIMainControl_HideUnityWindow_m1141355708)
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
请问下 这个是什么问题 我查过那个.a是支出arm64的
1、__weak typeof(self) weakself 总体来说,这个玩意儿直接报c++ requires a type specifier for all declarations
2、运行到手机上成功,然后过几秒钟 UnityGfxDeviceWorker(17):EXC_BAD_ACCE(code = 1,address = 0x1),很无语,启用僵尸对象定位也不行
望不吝赐教~
iOS端内部嵌入了两款AR的游戏,进入不同的场景使用 UnitySendMessage("Controller", "OpenSence",data);传递不同的参数,但是只有第一次启动他才能进入其中一个,当进入第二个发送新的消息时还是会显示第一个的游戏画面,iOS端Unity是无法关闭的,后来测试加入 UnityLoadApplication();
Profiler_InitProfiler();
切换偶尔是正常的,但有时候会显示错乱
麻烦看下
(void)showUnityWindow {
if (_didResignActive) {
UnityPause(false);
}
_didResignActive = NO;
UnityLoadApplication();
Profiler_InitProfiler();
self.window.hidden =YES;
self.unityWindow.hidden = NO;
[self.unityWindow makeKeyWindow];
}
(void)hideUnityWindow {
UnityPause(true);
_didResignActive = YES;
Profiler_UninitProfiler();
self.unityWindow.hidden = YES;
self.window.hidden = NO;
[self.window makeKeyWindow];
}
发送消息代码:
(void)wjBtnDidClicked {
[kAppDelegate showUnityWindow];
[self toUnityPageWithValue:@"wj"];
}
(void)scenesBtnDidClicked {
[kAppDelegate showUnityWindow];
[self toUnityPageWithValue:@"scenes"];
}
#pragma mark - 跳转到对应的Unity页面
(void)toUnityPageWithValue:(NSString *)value {
// TODO: 新增代码
//报错SendMessage: object Controller does not have receiver for function openSence! 说明UnitySendMessage传递的对象不具备相应的方法
const char *data = [value UTF8String];
/**
你那边需要打开场景的话 需要 传值给 OpenSence这个函数 通过ios给unity对象传值的方式 值有两个 "wj" 和 ”scenes“
"Controller" "openSence" "wj 或者 scenes"
*/
UnitySendMessage("Controller", "OpenSence",data);
}
进入过一个游戏的情况下返回主界面,这个时候使用UnitySendMessage("Controller", "OpenSence",data);发送消息切换到另一个游戏场景是不成功的,报错SendMessage: object Controller does not have receiver for function openSence!
可以的话可以私信加下你的QQ,十分感谢你的回答!
UnityInitApplicationNoGraphics([[[NSBundle mainBundle] bundlePath]UTF8String] );
这行代码就报错了没有提示,卡在汇编页了
-> 0x100ec89d0 <+136>: mov x19, x0
楼主遇到过这个问题吗?在线等!!!
楼主帅! 帅! 帅! 帅! 帅 !
544469923
张睿
都是这样的