iOS (Swift)集成 Unity步骤和各种填坑。

这个主要是记录一下公司项目里面集成Unity时候遇到的一些问题。供后来的集成参考使用。

集成期间遇到了不少问题模板也换来换去主要是使用Cardboard 或者 GoogleVRForUnity

Section1 准备

1.swift 2.3 (swift 3.0 应该也没有问题)
2.Xcode 8.2
3.Unity 5.6.0f1

Section2 开始集成

英文好的可以看看老外的集成文章可以说大部分人的参考步骤都是这个文章吧。

找了找中文的,步骤是参考 Nothing_lu的集成文章推荐先看看这里进行集成(我就是按照这个来的,证明能集成成功~,因为步骤都相同所以就不搬砖了,注意看一下下面的tip。)

tip:文章中有图片不清晰的地方里面的代码是这样的:

代码如图
var currentUnityController: UnityAppController!
    currentUnityController = UnityAppController()
    currentUnityController.application(application, didFinishLaunchingWithOptions: launchOptions)

main.swift
里面的代码我是使用的这个

// overriding @UIApplicationMain
custom_unity_init(Process.argc, Process.unsafeArgv)
UIApplicationMain(Process.argc, Process.unsafeArgv, NSStringFromClass(UIApplication), NSStringFromClass(AppDelegate))
main.swift

ok,如果集成好了就开始填坑吧~~~。

Section3 开始天坑=填坑???

  1. diff: /../Podfile.lock: No such file or directory
    diff: /Manifest.lock: No such file or directory
    error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.
    (Nothing同学的是新建一个工程,考虑大部分同学都会遇到这个问题,也能解决)
    根据说明 执行 pod install

Pods/Target Support Files/Pods-ZMCalendar/Pods-ZMCalendar.debug.xcconfig in your build configuration (UnityFix/Unity.xcconfig).

Pod的警告信息

这里看着应该是配置文件中缺少了什么,build工程以后发现错误依旧。。

这里参考了童冀这篇文章里面的内容

到Unity.xcconfig下面添加
//添加代码到Unity.xcconfig 里面

#include "Pods/Target Support Files/Pods-你的项目名/Pods-你的项目名.debug.xcconfig"
#include "Pods/Target Support Files/Pods-你的项目名/Pods-你的项目名.release.xcconfig"

Pod没有报错了。


Pod没有报错了

Command + B. 如果还报错,那么重启一下 Xcode.

  1. 发现错误
    swift:28:33: Use of undeclared type 'UnityAppController'


    UnityAppController

    配置正确的情况下这种错误一般是由于桥接文件没弄好造成的。
    所以查看桥接文件

添加上如图所示:

桥接文件添加
#import "UnityUtils.h"
#import "UnityAppController.h"
#import "UnityInterface.h"

Command + B (swift 编译一次可能需要 10分钟,一点不夸张。)

  1. 发现错误 (我当前使用的是 swift 2.3 如果没有报错请忽略这个错误)
    Use of unresolved identifier ''CommandLine“


    CommandLine.png

后来发现 这个错误是main.swift 里面写的好像是不对的。main.swift 里面写成这样

// main.swift
import Foundation
import UIKit
// overriding @UIApplicationMain
custom_unity_init(Process.argc, Process.unsafeArgv)
UIApplicationMain(Process.argc, Process.unsafeArgv, NSStringFromClass(UIApplication), NSStringFromClass(AppDelegate))
  1. 发现错误 'Unity/ObjCRuntime.h' file not found
错误4

尝试添加路径


Paste_Image.png
Paste_Image.png

这里面的路径比较多 其实就是链接到 当前的一个 库里面 如果出现这个错误 那么添加好对应的路径。

  1. 发现错误 :/Users/zhangxianqiang/Desktop/ZMCalendarSwift副本/XMGWB/Classes/Tools/Libs/Masonry/MASConstraintMaker.m:55:5: Use of undeclared identifier 'NSAssert'

这个貌似是和 marsony 里面有所冲突
修改方法:

Paste_Image.png
  1. 报错
il2cpp-config.h

解决方法: (这种错误 一般就是 路径问题 所以 图中的 路径请注意 你的可能不是叫 UnityFix!!!)

解决方法

7错误 undeclared identifier 'UnityParseCommandLine'


undeclared identifier 'UnityParseCommandLine'

解决方法:

替换方法

8.报错 GVROverlayView.h file not found

GVROverlayView.h file not found

解决方法:
a. 当前我这个版本没有找到对应的 sdk (如果你的小伙伴用了新版的 Unity 模板文件 可能没有这个问题)

解决方法
  1. 报错
RegisterMonoModules.o

解决方法:
c c++ 里面都添加上这个 -DINIT_SCRIPTING_BACKEND=1


c c++ 里面都添加上这个

到这里 我的工程跑起来了 因为小伙伴的 Unity里面使用的库文件经常变化 所以后面可能还遇到不同的坑。

Section 3 额外的一些坑记录。

  1. "csingle" file not found
    "csingle" file not found

    解决说明: 这个问题好像是Xcdoe的问题 我编译通过了也会报这个错。

2.cannot use '@throw' with Objective-C exceptions disabled (masrony 集成到工程里面可能会有这个错)

masrony @throw

解决方法:

@throw,解决方法
  1. gvr::creatMainApp_Expec...
gvr::creatMainApp_Expec

(这个的解决方法不是很好, 如果有好方法请留言告诉我)

#include <vector>
namespace gvr {
    class VrApp;
    VrApp* CreateMainApp__EXPECTED_EXACTLY_ONE_VR_MAIN_APP_STATEMENT__(const std::vector<std::string>&) { return nullptr; }
}
gvr::creatMainApp_Expec 解决方法
  1. 更新版本遇到这个错误GoolekitCore.o:
GoolekitCore.o

这个是因为 库冲突了 如果你的Untiy小伙伴用了最新的google cardboard库 那么就 Podfile 里面去掉 GVRSDK。

  1. 另外 cocoapods 来回弄 遇到了这个问题 Attempt to read non existent folder!!


    Attempt to read non existent folder

解决方法: 别的地方说卸载了cocoapod 重新安装?? 我没有试验过,我只是 修改了文件夹的中文名字变成了英文,然后 把这个工程放到了另外一个文件夹里面再次运行pod install 就行了。

6.(2017.8.10)添加一个错误 这个错误是编译已经通过了,跑在真机的时候直接崩溃的问题。

missing sampler binding at index 0 for _mtlsmp__MainTex[0].
missing sampler binding at inde...的解决方法
  1. 报错 ---> (这里是unity 更换了 5.4.2f0)
RegisterMonoModules方法冲突错误1.png
RegisterMonoModules方法冲突错误2.png

build settings 里面:
Other C Flag: -DINIT_SCRIPTING_BACKEND=1
Other C++ Flag: -DINIT_SCRIPTING_BACKEND=1

8 . gfx device intialization failed

xcode 直接断开和手机的链接了.. 这个问题纠缠了我好久了。google上面并没有什么答案,大概靠谱一点的就是说Unity的配置为题,版本有的不兼容Metal。。 具体的配置可以参考我下面给出的Unity配置图片,另外可以试试修改工程里面 Edit Schema -> Options -> GPU Frame Caputure 里面进行转换对应的选项。
但是我遇到的都不是这个问题。
通过intialization failed 发现其实是有东西没初始化,但是又不给任何提示。所以总结起来就是我们如果要保证一开始就要有初始化unity的步骤。注意 自己创建的 main.swift 文件。还有就是Appdelegate里面的@UIApplicationMain 需要注销。具体的步骤参考的步骤Nothing_lu的集成文章集成步骤的第十步。
这里其实可以写一个swift(iOS)工程的启动解析了。

  1. 报错:Bulk_Assembly-CSharp_ 文件报错。


    Bulk_Assembly-CSharp_

Tip:这个里面说明的是我们对一些函数并没有定义,我个人对C C++ 并不是很擅长,看了几篇文章,里面大概的意思是这个文件包裹了一些函数供后续的调用,如果出现了这个错误,仔细观察一下是什么前缀,此处图中是GCloudVioce,后来才分析到是Unity里面添加了一个三方库,并没有给到我。
解决:添加.a库

添加库
  1. MTLDebugRenderCommandEncoder.mm:1331: failed assertion `(rect.y(0) + rect.height(720))(720) must be <= 687'

解决:这里是调整了这里,选择不用Metal。。 不知道有没有好的方案。

MTLDebugRenderCommandEncoder error
  1. NSUnknownKeyException: [<unitytoios.AppDelegate 0x1555ad30> valueForUndefinedKey:]: this class is not key value coding-compliant for the key currentUnityController

解决: 这个问题是一个小伙伴提出来的,是因为他用了 Xcode 9 swift4.0 导致的,可能是语言有升级的关系 appdelegate 里面 修改一下这个 @objc var currentUnityController: UnityAppController? 添加上objc!

Section 5 后续

1.如果你看到有问题或者有好的解决方法,请留言告诉我。
2.如果你遇到问题了,我尽量解答,因为这里面的坑太多了。
3.对你有帮助请留言告诉我。
4.没有解决问题也请让我知道你来过这里。
5.生活不容易, 就像每次编译这个工程 都需要 10分钟以上。所以 这个文章一边上班一边写了好几天。

参考文章
//www.greatytc.com/p/e8217896d6ff
http://www.cnblogs.com/fuunnyy/p/6227740.html
//www.greatytc.com/p/1a141e4fccb3

没时间吐槽了,写了这个文章。当做记录。

=============================================
4.24 添加更新:主要是记录一下 unity 小伙伴如果更新了 他们的版本然后我们这边更换集成文件的主要步骤。

1.找到相应的文件夹 替换 classes, Data,Libraries文件夹。工程里面最好是先删除引用,然后再次导入.(classes,Libraries create groups
data 选择 create folder references)

2.修改 classes/main.mm 里面的 main -> main_unity_default
UnityParseCommandLine -> UnityInitRuntime(这个不一定要换。囧~)


这个就是因为没有修改main 到 main_unity_default 尴尬~

3.Libraries/RegisterFeatures.mm 添加

#include <vector>
namespace gvr {
    class VrApp;
    VrApp* CreateMainApp__EXPECTED_EXACTLY_ONE_VR_MAIN_APP_STATEMENT__(const std::vector<std::string>&) { return nullptr; }
}
  1. 找到UnityAppController.h
    添加:#import <UIKit/UIKit.h>、@class UnityViewControllerBase;
    //注释此方法
inline UnityAppController*    GetAppController()
{
    return (UnityAppController*)[UIApplication sharedApplication].delegate;
}

//替换成这个方法

NS_INLINE UnityAppController* GetAppController()
{
    NSObject<UIApplicationDelegate>* delegate = [UIApplication sharedApplication].delegate;
    UnityAppController* currentUnityController = (UnityAppController *)[delegate valueForKey:@"currentUnityController"];
    return currentUnityController;
}

5.各种库文件找不到。 这个可能是因为没有响应的库文件,检查一下:


这里的库文件.png

(如果你是用的pod 管理的 GVRSDK,那么这里应该没有不然会报很多冲突的错误。)

8.记录一下unity的配置情况


配置Unity-->大概是这么配置的.png

4.28 添加更新。(App里面 现在又添加了一个 百度语音的功能,我先暂时写到这里面,有时间会整理成另外一篇文章的。)

首先导入的 3方库 TTTAttributedLabel 这个要是用cocoapods 可以使用 1.6.1版本

appcontroller 里面添加一个接收方法 。目前不知道能不能成功调用,(下面的代码直接使用是接收不到的!!!)

void Voice (char *buy_id)
{
    UIAlertView *alert = [[UIAlertView alloc] init];
    [alert setTitle:@"1"];
    [alert setMessage:[NSString stringWithUTF8String:buy_id]];
    [alert addButtonWithTitle:@"确定"];
    [alert  show];
}

后来问了 Unity 的小伙伴得知应该添加如下的代码:(这段代码说是可以添加到工程的任何位置,iOS 的OC工程应该是可以的,我选择这里是因为我的工程是 swift 的工程,这里面肯定是运行不了这个的具体的原因这里就不说了,感兴趣的可以去研究一下,囧~~)

//代码定义区域 A
#if defined(__cplusplus)
extern "C"{
#endif
    
    //    个人资料联系他
    extern void _Voice( char* toPayStr);
    
    
#if defined(__cplusplus)
}
#endif

//代码定义区域 B
#if defined(__cplusplus)
extern "C"{
#endif
    
    extern void _Voice( char* toPayStr){
        
        NSLog(@"调用了_Voice--%s",toPayStr);
        NSString *str = [NSString stringWithFormat:@"%s",toPayStr];
        [[NSNotificationCenter defaultCenter] postNotificationName:@"unitySendMessageNoti" object:nil userInfo:@{@"message":str}];
    }
    
#if defined(__cplusplus)
}
#endif

另外这里我用OC 的方式 发送了一条通知,让Unity的消息传到swift的代码中,如果哪个小伙伴有好的方式进行交互可以留言告诉我~。

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

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,955评论 4 60
  • 转载自:https://github.com/Tim9Liu9/TimLiu-iOS[https://github...
    香橙柚子阅读 8,369评论 0 35
  • 最近收了一个徒儿。 我们不去西天,也不去取经,但或许在人生路上可以互相取经。 她问我:师父,师母呢。你都这么大人了...
    十四先森阅读 363评论 0 0
  • “失去身边的谁都是痛苦的,不论他们是人还是狗,都会在心里留有一个巨大的空洞。” —《我们梦中见》 大熊女友生日之前...
    未来回忆俱乐部阅读 805评论 4 6
  • 周边高层均价12000—13000二手 楼盘均价9500—11000 占地:2.2万 建面:5.4万 诸暨城东。东...
    吖跑跑熊阅读 309评论 0 0