iOS项目接入Unity3d项目以及我遇到的坑集合

最近在弄一个iOS的嵌入统一的功能,大费脑细胞......各种坑,网上找了很多帖子方法,虽然我比较懒,很少整理发表,大多自己记录在本地,但是这个集成方法网上帖子不多且散,所以还是整理成小白篇发出来,希望能帮到大家.OK,话不多说,直接开搞!!

一,接入:

首先,在统一开发同学发过来的团结工程后用真机运行一下他们的代码,确保可以正常运行这部分大概会有一些错,大多是单位工程的配置问题,例如:


这里在打包出来的时候,包里的库丢失了,得重新导入,在能运行。


这个就是要配置好签下的团队等相关信息了


这个则是需要unity同学配置好的ShareSDKUnity3DBridge的文件,替换掉Unity unity项目里的ShareSDKUnity3DBridge .h和.m文件

总之要真机运行成功之后才开始接入,并且,建议新手怕出错代码回撤麻烦,可以新建一个项目试试水,然后再在实际项目中集成。

运行成功之后,就是将统一工程中的文件和库导入我们自己的iOS的项目了睁大眼睛看步骤:

导入类,库,MapFileParser.sh三个文件。说明一下,Frameworks或者SDK我也导入了,因为这两个文件夹里有我需要用到的sdk,所以大家视情​​况而定。                                           

开始之前,记得看下Unity导出工程时设置bundle id是否与项目一致,修改Build设置下位代码为NO,删除Main.storyboard,代码设置控制器方便切换窗口(不要跟我说不会代码设置控制器)

1.导入类,库,MapFileParser.sh三个文件,并且选择的是

别选错了加入的方式

2.导入数据文件,选择创建文件夹引用

最后如图:

框架和SDK视情况而定了哈

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

Library Search Paths红圈为必须要加的路径,黄圈为我自己添加的sdk文件夹路径      

$(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内容如图:

注意修改图中红圈中的内容:const char * AppControllerClassName =“AppDelegate”;还有将UIApplicationMain(argc,argv,nil,[NSString stringWithUTF8String:AppControllerClassName]);替换成返回UIApplicationMain(argc,argv,nil,NSStringFromClass ([AppDelegate class]));

5.在UnityAppController.h中引入AppDelegate #import“AppDelegate.h”,再修改inlineUnityAppController * GetAppController()方法  

AppDelegate *委托=(AppDelegate *)[UIApplication sharedApplication] .delegate;

return delegate.unityController;

6.新建一个PCH文件

副本下的类下的Prefix.pch文件内容到新建的prefixHeader文件

copycopy

记得添加#进口 “UnityAppController.h” 的引用

命令+ v

删除原来的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.

----------->解决方法:

直接返回0或者NULL

还有一个可能的解决办法就是需要你手动删除类别下的本地文件夹中的.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的冲动,然后就可以自己做动画游戏玩了,想想都很爽,说不定游戏大火我就不用敲代码了,吼吼吼~~~

好了,总结就暂时到这,可能还有很多的不足和错误之处,希望大家能指出,共同研究,一起进步,有补充的记得评论给我啊,后续继续修改补充~用的“巴适”记得点个赞~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容