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同學的是新建一個工程门岔,考慮大部分同學都會遇到這個問題爱致,也能解決)
    根據(jù)說明 執(zhí)行 pod install

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

Pod的警告信息

這里看著應該是配置文件中缺少了什么,build工程以后發(fā)現(xiàn)錯誤依舊寒随。糠悯。

這里參考了童冀這篇文章里面的內(nèi)容

到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. 發(fā)現(xiàn)錯誤
    swift:28:33: Use of undeclared type 'UnityAppController'


    UnityAppController

    配置正確的情況下這種錯誤一般是由于橋接文件沒弄好造成的互艾。
    所以查看橋接文件

添加上如圖所示:

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

Command + B (swift 編譯一次可能需要 10分鐘,一點不夸張讯泣。)

  1. 發(fā)現(xiàn)錯誤 (我當前使用的是 swift 2.3 如果沒有報錯請忽略這個錯誤)
    Use of unresolved identifier ''CommandLine“


    CommandLine.png

后來發(fā)現(xiàn) 這個錯誤是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. 發(fā)現(xiàn)錯誤 'Unity/ObjCRuntime.h' file not found
錯誤4

嘗試添加路徑


Paste_Image.png
Paste_Image.png

這里面的路徑比較多 其實就是鏈接到 當前的一個 庫里面 如果出現(xiàn)這個錯誤 那么添加好對應的路徑。

  1. 發(fā)現(xiàn)錯誤 :/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!W蚣凇=谑印)

解決方法

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里面使用的庫文件經(jīng)常變化 所以后面可能還遇到不同的坑。

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)添加一個錯誤 這個錯誤是編譯已經(jīng)通過了烤芦,跑在真機的時候直接崩潰的問題举娩。

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 里面進行轉(zhuǎn)換對應的選項骄噪。
但是我遇到的都不是這個問題。
通過intialization failed 發(fā)現(xiàn)其實是有東西沒初始化蠢箩,但是又不給任何提示链蕊。所以總結(jié)起來就是我們?nèi)绻WC一開始就要有初始化unity的步驟。注意 自己創(chuàng)建的 main.swift 文件谬泌。還有就是Appdelegate里面的@UIApplicationMain 需要注銷滔韵。具體的步驟參考的步驟Nothing_lu的集成文章集成步驟的第十步。
這里其實可以寫一個swift(iOS)工程的啟動解析了掌实。

  1. 報錯:Bulk_Assembly-CSharp_ 文件報錯陪蜻。


    Bulk_Assembly-CSharp_

Tip:這個里面說明的是我們對一些函數(shù)并沒有定義,我個人對C C++ 并不是很擅長贱鼻,看了幾篇文章宴卖,里面大概的意思是這個文件包裹了一些函數(shù)供后續(xù)的調(diào)用,如果出現(xiàn)了這個錯誤邻悬,仔細觀察一下是什么前綴症昏,此處圖中是GCloudVioce,后來才分析到是Unity里面添加了一個三方庫,并沒有給到我父丰。
解決:添加.a庫

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

解決:這里是調(diào)整了這里肝谭,選擇不用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 后續(xù)

1.如果你看到有問題或者有好的解決方法栏赴,請留言告訴我。
2.如果你遇到問題了靖秩,我盡量解答,因為這里面的坑太多了竖瘾。
3.對你有幫助請留言告訴我沟突。
4.沒有解決問題也請讓我知道你來過這里。
5.生活不容易捕传, 就像每次編譯這個工程 都需要 10分鐘以上惠拭。所以 這個文章一邊上班一邊寫了好幾天。

參考文章
http://www.reibang.com/p/e8217896d6ff
http://www.cnblogs.com/fuunnyy/p/6227740.html
http://www.reibang.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里面 現(xiàn)在又添加了一個 百度語音的功能,我先暫時寫到這里面掐场,有時間會整理成另外一篇文章的往扔。)

首先導入的 3方庫 TTTAttributedLabel 這個要是用cocoapods 可以使用 1.6.1版本

appcontroller 里面添加一個接收方法 。目前不知道能不能成功調(diào)用,(下面的代碼直接使用是接收不到的?桃蕖H壳颉!)

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 的工程,這里面肯定是運行不了這個的具體的原因這里就不說了,感興趣的可以去研究一下,囧~~)

//代碼定義區(qū)域 A
#if defined(__cplusplus)
extern "C"{
#endif
    
    //    個人資料聯(lián)系他
    extern void _Voice( char* toPayStr);
    
    
#if defined(__cplusplus)
}
#endif

//代碼定義區(qū)域 B
#if defined(__cplusplus)
extern "C"{
#endif
    
    extern void _Voice( char* toPayStr){
        
        NSLog(@"調(diào)用了_Voice--%s",toPayStr);
        NSString *str = [NSString stringWithFormat:@"%s",toPayStr];
        [[NSNotificationCenter defaultCenter] postNotificationName:@"unitySendMessageNoti" object:nil userInfo:@{@"message":str}];
    }
    
#if defined(__cplusplus)
}
#endif

另外這里我用OC 的方式 發(fā)送了一條通知绿饵,讓Unity的消息傳到swift的代碼中欠肾,如果哪個小伙伴有好的方式進行交互可以留言告訴我~。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拟赊,一起剝皮案震驚了整個濱河市刺桃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吸祟,老刑警劉巖瑟慈,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屋匕,死亡現(xiàn)場離奇詭異葛碧,居然都是意外死亡,警方通過查閱死者的電腦和手機进泼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門逼纸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呻纹,“玉大人涝婉,你說我怎么就攤上這事墩弯≈渚” “怎么了梁丘?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵掏觉,是天一觀的道長杨何。 經(jīng)常有香客問我槽地,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮二鳄,結(jié)果婚禮上赴涵,老公的妹妹穿的比我還像新娘。我一直安慰自己订讼,他們只是感情好髓窜,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著欺殿,像睡著了一般寄纵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上脖苏,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天程拭,我揣著相機與錄音,去河邊找鬼棍潘。 笑死恃鞋,一個胖子當著我的面吹牛崖媚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播山宾,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼至扰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了资锰?” 一聲冷哼從身側(cè)響起敢课,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绷杜,沒想到半個月后直秆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡鞭盟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年圾结,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片齿诉。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡筝野,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出粤剧,到底是詐尸還是另有隱情歇竟,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布抵恋,位于F島的核電站焕议,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏弧关。R本人自食惡果不足惜盅安,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望世囊。 院中可真熱鬧别瞭,春花似錦、人聲如沸株憾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽号胚。三九已至籽慢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間猫胁,已是汗流浹背箱亿。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留弃秆,地道東北人。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓瘩欺,卻偏偏與公主長得像歌粥,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫、插件账磺、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,066評論 4 62
  • 轉(zhuǎn)載自:https://github.com/Tim9Liu9/TimLiu-iOS[https://github...
    香橙柚子閱讀 8,498評論 0 35
  • 最近收了一個徒兒。 我們不去西天买窟,也不去取經(jīng),但或許在人生路上可以互相取經(jīng)。 她問我:師父径簿,師母呢锄贷。你都這么大人了...
    十四先森閱讀 371評論 0 0
  • “失去身邊的誰都是痛苦的,不論他們是人還是狗,都會在心里留有一個巨大的空洞∧餍鳎” —《我們夢中見》 大熊女友生日之前...
    未來回憶俱樂部閱讀 810評論 4 6
  • 周邊高層均價12000—13000二手 樓盤均價9500—11000 占地:2.2萬 建面:5.4萬 諸暨城東榄鉴。東...
    吖跑跑熊閱讀 322評論 0 0