最近在弄一个iOS的嵌入统一的功能,大费脑细胞......各种坑,网上找了很多帖子方法,虽然我比较懒,很少整理发表,大多自己记录在本地,但是这个集成方法网上帖子不多且散,所以还是整理成小白篇发出来,希望能帮到大家.OK,话不多说,直接开搞!!
一,接入:
首先,在统一开发同学发过来的团结工程后用真机运行一下他们的代码,确保可以正常运行这部分大概会有一些错,大多是单位工程的配置问题,例如:
总之要真机运行成功之后才开始接入,并且,建议新手怕出错代码回撤麻烦,可以新建一个项目试试水,然后再在实际项目中集成。
运行成功之后,就是将统一工程中的文件和库导入我们自己的iOS的项目了睁大眼睛看步骤:
开始之前,记得看下Unity导出工程时设置bundle id是否与项目一致,修改Build设置下位代码为NO,删除Main.storyboard,代码设置控制器方便切换窗口(不要跟我说不会代码设置控制器)
1.导入类,库,MapFileParser.sh三个文件,并且选择的是
2.导入数据文件,选择创建文件夹引用
最后如图:
3.接下来,添加好这些文件之后,需要在Build Settings下的Header Search Paths和Library Search Paths下添加对应的路径,注意⚠️:这里的路径也是自己对应文件夹的路径,并非和图中一样:
Header SearchPaths:$(SRCROOT)/ MedsciDecision / Public / Unity3d / Libraries / libil2cpp / include $(SRCROOT)/ MedsciDecision / Public / Unity3d / Libraries $(SRCROOT)/ MedsciDecision / Public / Unity3d / Classes $(SRCROOT)/ MedsciDecision / Public / Unity3d / Classes / Native $(SRCROOT)/ MedsciDecision / Public / Unity3d
图书馆搜索路径:
$(PROJECT_DIR)/ MedsciDecision /公共/ Unity3d /库$(PROJECT_DIR)/ MedsciDecision /公共/ Unity3d /库/插件/ iOS的$(PROJECT_DIR)/ MedsciDecision /公共/ Unity3d
$(SRCROOT)是指.xcproj文件所在的路径,类和库文件夹是在与MedsciDecision.xcproj文件同级的文件夹下面的。所以SRCROOT下面要再添加MedsciDecision层级如果此处路径配置不正确,可能会出现诸如il2cpp-config.h文件未找到编译错误
别忘了,还有一个MapFileParser.sh文件,在Build阶段下点击“+”号,添加一个运行脚本
并在添加的运行脚本中写好脚本:“$ PROJECT_DIR / MedsciDecision / Public / Unity3d / MapFileParser.sh”
⚠️:脚本路径也是你的MapFileParser.sh文件的正确路径
在导入完文件之后,马上进行文件和项目的一些配置修改吧,不然后面容易忘:
4.复制类,统一下的main.mm中的内容,粘贴到iOS的项目中的main.m文件文件中,并删除类,统一下的main.mm文件,将iOS的项目中的main.m文件重命名为main.mm,并修改添加如下内容:
const char * AppControllerClassName =“AppDelegate”;
返回UIApplicationMain(argc,argv,nil,NSStringFromClass([AppDelegate class]));
新的main.mm内容如图:
5.在UnityAppController.h中引入AppDelegate #import“AppDelegate.h”,再修改inlineUnityAppController * GetAppController()方法
AppDelegate *委托=(AppDelegate *)[UIApplication sharedApplication] .delegate;
return delegate.unityController;
6.新建一个PCH文件
副本下的类下的Prefix.pch文件内容到新建的prefixHeader文件
记得添加#进口 “UnityAppController.h” 的引用
删除原来的pch文件注意删除选择的是删除参考选项
导入新的PCH文件路径,注意是导入自己正确的路径,不要和图中相同(图中为我的文件路径)
除了以上很明显的配置和文件内容修改,你还需要在Build Settings下的其他C标志中添加-DINIT_SCRIPTING_BACKEND = 1
还要添加用户定义设置,什么?不会添加用户定义设置?看图
添加
GCC_THUMB_SUPPORT ----> NO
GCC_USE_INDIRECT_FUNCTION_CALLS ----> NO
UNITY_RUNTIME_VERSION ----> 5.6.1f1(5.6.1f1为统一开发人员要统一的版本号)
UNITY_SCRIPTING_BACKEND ----> il2cpp
7.如果这个时候编译,肯定会报错,找不到库,所以接下来,很重要也很费事的导入库有的项目库很多,所以要细心耐心的对照统一项目一一对应的导入,并且,注意库的状态,大部分是必需的,但有少部分是可选的。
在构建阶段下的链接二进制文件库下导入相应的库
有的库系统不支持,这也是为什么我要导入SDK和框架文件了,因为里面的shareSDK系统没有,这个时候,添加其他,并从项目对应的文件夹下找到需要的库文件,导入
二,使用
关于使用,总结下大致两套思路,一个加载的iOS页面,然后给一个入口跳转统一页面,比如按钮点击抑或是页面推送,通过切换窗口来达到目的,还有一个就是在UnityAppController.mm中拦截 - (空隙)startUnity:(UIApplication的*)应用的方法执行,在这里创建一个我们自己的视图来显示的iOS页面,再通过建立按钮,点击来继续startUnity的方法。
方法一:
AppDelegate.h和.M
#import“UnityAppController.h”
@interface AppDelegate:UIResponder
@属性(强,非原子)UIWindow *窗口;
@属性(强,非原子)UIWindow * unityWindow;
@property(strong,nonatomic)UnityAppController * unityController;
- (void)showUnityWindow;
- (void)hideUnityWindow;
@implementation AppDelegate
- (UIWindow *)unityWindow {
返回UnityGetMainWindow();
}
- (void)showUnityWindow {
UIButton * button = [UIButton buttonWithType:UIButtonTypeSystem];
button.frame = CGRectMake(0,0,155,85);
button.backgroundColor = [UIColor redColor];
[button setTitle:@“back”forState:UIControlStateNormal];
[button addTarget:self action:@selector(hideUnityWindow)forControlEvents:UIControlEventTouchUpInside];
[self.unityWindow addSubview:button];
[[UIApplication sharedApplication] setStatusBarHidden:YES];
[self.unityWindow makeKeyAndVisible];
}
- (void)hideUnityWindow {
[[UIApplication sharedApplication] setStatusBarHidden:NO];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];
[self.window makeKeyAndVisible];
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen] .bounds]; self.window.backgroundColor = [UIColor whiteColor];
ViewController * vc = [[ViewController alloc] init];
self.window.rootViewController = vc;
self.unityController = [[UnityAppController alloc] init];
[self.unityController application:application didFinishLaunchingWithOptions:launchOptions]; [self.window makeKeyAndVisible];
返回YES;
}
- (void)applicationWillResignActive:(UIApplication *)application {
[self.unityController applicationWillResignActive:application];
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
[self.unityController applicationDidEnterBackground:application];
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
[self.unityController applicationWillEnterForeground:application];
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
[self.unityController applicationDidBecomeActive:application];
}
- (void)applicationWillTerminate:(UIApplication *)application {
[self.unityController applicationWillTerminate:application];
}
如果上面步骤你照做了,但是程序会崩溃,不妨试试将除了didFinishLaunchingWithOptions中有关的unity代理统统注释,再运行。当然,这个是不建议的
方法二:
在UnityAppController.m文件下的applicationDidBecomeActive中修改[selfperformSelector:@selector(startUnity:)withObject: applicationafterDelay:0];自定义一个方法,然后在自定义的方法中显示我们自己的viewcontroller,在viewcontrller中设置一个方法可以调用startUnity的方法。此方法只适用简单的iOS页面,一般iOS接入unity还是用方法一比较好。这里就不赘述了。
三,坑(以下坑无优先级,随意排序)
1.
----------->解决方法:
还有一个可能的解决办法就是需要你手动删除类别下的本地文件夹中的.H文件和库下libil2cpp文件夹;
2.打包会报错:禁用Objective-C异常时使用“@try”----------->解决方法:修改target - > build settings - > All | 结合 - >苹果LLVM编译器6.0 - 语言中启用Objective-C异常为YES
3.如果有libiPhone-lib.a这个库,但编译时报错说找不到-liphone-lib ----------->解决方法:库搜索路径中重新编辑下$(SRCROOT) /图书馆的路径就行了
4。
xcode项目编译与优化 - 步行可能会表现奇怪;变量可能不可用----------->解决方法:
一,查看是否为调试模式
湾项目的优化级别设置
c。有无额外的编译c ++标志
d。把建筑中的平台指为“IOS”,而不是默认的“iphone”。
5.在xcode调试状态下报错:validateRenderPassDescriptor:551: failed assertion `Texture at depthAttachment has usage (0x01) which doesn't specify MTLTextureUsageRenderTarget (0x04)'
(线程中断,二进制的中断位置报错:UnityGfxDeviceWorker (14): signal SIGABRT)----------->解决方法:1 关掉xcode 里面的Metal API Validation 2 unity设置里用OpenGLES 代替 Metal.
6.
7.failed assertion `Texture at stencilAttachment has usage (0x01) which doesn't specify MTLTextureUsageRenderTarget (0x04)'----------->解决方法1关掉xcode里面的Metal API Validation
2 unity设置里用OpenGLES代替Metal.
三、参考
http://qingqinghebiancao.github.io/2016/09/07/Unity集成到iOS本地工程中/
http://blog.163.com/savage_cui/blog/static/64335507201332834915876/
http://blog.csdn.net/niuhailei/article/details/50911513
http://alexanderwong.me/post/29949258838/building-a-ios-unity-uiview-uiviewcontroller
http://www.jianshu.com/p/af6f8260a811
http://www.jianshu.com/p/715adc38e451
http://www.jianshu.com/p/f98bcfe09dc7
http://www.jianshu.com/p/dc68baad8bdb
在集合的过程中,查看了大量的unity相关文章,看了很多unity的项目,有种分分钟想学会unity的冲动,然后就可以自己做动画游戏玩了,想想都很爽,说不定游戏大火我就不用敲代码了,吼吼吼~~~
好了,总结就暂时到这,可能还有很多的不足和错误之处,希望大家能指出,共同研究,一起进步,有补充的记得评论给我啊,后续继续修改补充~用的“巴适”记得点个赞~