iOS (Swift)集成 Unity步驟和各種填坑。

這個(gè)主要是記錄一下公司項(xiàng)目里面集成Unity時(shí)候遇到的一些問(wèn)題。供后來(lái)的集成參考使用。

集成期間遇到了不少問(wèn)題模板也換來(lái)?yè)Q去主要是使用Cardboard 或者 GoogleVRForUnity

Section1 準(zhǔn)備

1.swift 2.3 (swift 3.0 應(yīng)該也沒(méi)有問(wèn)題)
2.Xcode 8.2
3.Unity 5.6.0f1

Section2 開(kāi)始集成

英文好的可以看看老外的集成文章可以說(shuō)大部分人的參考步驟都是這個(gè)文章吧。

找了找中文的,步驟是參考 Nothing_lu的集成文章推薦先看看這里進(jìn)行集成(我就是按照這個(gè)來(lái)的,證明能集成成功~,因?yàn)椴襟E都相同所以就不搬磚了,注意看一下下面的tip。)

tip:文章中有圖片不清晰的地方里面的代碼是這樣的:

代碼如圖
var currentUnityController: UnityAppController!
    currentUnityController = UnityAppController()
    currentUnityController.application(application, didFinishLaunchingWithOptions: launchOptions)

main.swift
里面的代碼我是使用的這個(gè)

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

ok,如果集成好了就開(kāi)始填坑吧~~~。

Section3 開(kāi)始天坑=填坑???

  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同學(xué)的是新建一個(gè)工程,考慮大部分同學(xué)都會(huì)遇到這個(gè)問(wèn)題,也能解決)
    根據(jù)說(shuō)明 執(zhí)行 pod install

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

Pod的警告信息

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

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

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

#include "Pods/Target Support Files/Pods-你的項(xiàng)目名/Pods-你的項(xiàng)目名.debug.xcconfig"
#include "Pods/Target Support Files/Pods-你的項(xiàng)目名/Pods-你的項(xiàng)目名.release.xcconfig"

Pod沒(méi)有報(bào)錯(cuò)了。


Pod沒(méi)有報(bào)錯(cuò)了

Command + B. 如果還報(bào)錯(cuò),那么重啟一下 Xcode.

  1. 發(fā)現(xiàn)錯(cuò)誤
    swift:28:33: Use of undeclared type 'UnityAppController'


    UnityAppController

    配置正確的情況下這種錯(cuò)誤一般是由于橋接文件沒(méi)弄好造成的。
    所以查看橋接文件

添加上如圖所示:

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

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

  1. 發(fā)現(xiàn)錯(cuò)誤 (我當(dāng)前使用的是 swift 2.3 如果沒(méi)有報(bào)錯(cuò)請(qǐng)忽略這個(gè)錯(cuò)誤)
    Use of unresolved identifier ''CommandLine“


    CommandLine.png

后來(lái)發(fā)現(xiàn) 這個(gè)錯(cuò)誤是main.swift 里面寫(xiě)的好像是不對(duì)的。main.swift 里面寫(xiě)成這樣

// 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)錯(cuò)誤 'Unity/ObjCRuntime.h' file not found
錯(cuò)誤4

嘗試添加路徑


Paste_Image.png
Paste_Image.png

這里面的路徑比較多 其實(shí)就是鏈接到 當(dāng)前的一個(gè) 庫(kù)里面 如果出現(xiàn)這個(gè)錯(cuò)誤 那么添加好對(duì)應(yīng)的路徑。

  1. 發(fā)現(xiàn)錯(cuò)誤 :/Users/zhangxianqiang/Desktop/ZMCalendarSwift副本/XMGWB/Classes/Tools/Libs/Masonry/MASConstraintMaker.m:55:5: Use of undeclared identifier 'NSAssert'

這個(gè)貌似是和 marsony 里面有所沖突
修改方法:

Paste_Image.png
  1. 報(bào)錯(cuò)
il2cpp-config.h

解決方法: (這種錯(cuò)誤 一般就是 路徑問(wèn)題 所以 圖中的 路徑請(qǐng)注意 你的可能不是叫 UnityFix?。。。?/p>

解決方法

7錯(cuò)誤 undeclared identifier 'UnityParseCommandLine'


undeclared identifier 'UnityParseCommandLine'

解決方法:

替換方法

8.報(bào)錯(cuò) GVROverlayView.h file not found

GVROverlayView.h file not found

解決方法:
a. 當(dāng)前我這個(gè)版本沒(méi)有找到對(duì)應(yīng)的 sdk (如果你的小伙伴用了新版的 Unity 模板文件 可能沒(méi)有這個(gè)問(wèn)題)

解決方法
  1. 報(bào)錯(cuò)
RegisterMonoModules.o

解決方法:
c c++ 里面都添加上這個(gè) -DINIT_SCRIPTING_BACKEND=1


c c++ 里面都添加上這個(gè)

到這里 我的工程跑起來(lái)了 因?yàn)樾』锇榈?Unity里面使用的庫(kù)文件經(jīng)常變化 所以后面可能還遇到不同的坑。

Section 3 額外的一些坑記錄。

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

    解決說(shuō)明: 這個(gè)問(wèn)題好像是Xcdoe的問(wèn)題 我編譯通過(guò)了也會(huì)報(bào)這個(gè)錯(cuò)。

2.cannot use '@throw' with Objective-C exceptions disabled (masrony 集成到工程里面可能會(huì)有這個(gè)錯(cuò))

masrony @throw

解決方法:

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

(這個(gè)的解決方法不是很好, 如果有好方法請(qǐng)留言告訴我)

#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. 更新版本遇到這個(gè)錯(cuò)誤GoolekitCore.o:
GoolekitCore.o

這個(gè)是因?yàn)?庫(kù)沖突了 如果你的Untiy小伙伴用了最新的google cardboard庫(kù) 那么就 Podfile 里面去掉 GVRSDK。

  1. 另外 cocoapods 來(lái)回弄 遇到了這個(gè)問(wèn)題 Attempt to read non existent folder!!


    Attempt to read non existent folder

解決方法: 別的地方說(shuō)卸載了cocoapod 重新安裝?? 我沒(méi)有試驗(yàn)過(guò),我只是 修改了文件夾的中文名字變成了英文,然后 把這個(gè)工程放到了另外一個(gè)文件夾里面再次運(yùn)行pod install 就行了。

6.(2017.8.10)添加一個(gè)錯(cuò)誤 這個(gè)錯(cuò)誤是編譯已經(jīng)通過(guò)了,跑在真機(jī)的時(shí)候直接崩潰的問(wèn)題。

missing sampler binding at index 0 for _mtlsmp__MainTex[0].
missing sampler binding at inde...的解決方法
  1. 報(bào)錯(cuò) ---> (這里是unity 更換了 5.4.2f0)
RegisterMonoModules方法沖突錯(cuò)誤1.png
RegisterMonoModules方法沖突錯(cuò)誤2.png

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

8 . gfx device intialization failed

xcode 直接斷開(kāi)和手機(jī)的鏈接了.. 這個(gè)問(wèn)題糾纏了我好久了。google上面并沒(méi)有什么答案,大概靠譜一點(diǎn)的就是說(shuō)Unity的配置為題,版本有的不兼容Metal。。 具體的配置可以參考我下面給出的Unity配置圖片,另外可以試試修改工程里面 Edit Schema -> Options -> GPU Frame Caputure 里面進(jìn)行轉(zhuǎn)換對(duì)應(yīng)的選項(xiàng)。
但是我遇到的都不是這個(gè)問(wèn)題。
通過(guò)intialization failed 發(fā)現(xiàn)其實(shí)是有東西沒(méi)初始化,但是又不給任何提示。所以總結(jié)起來(lái)就是我們?nèi)绻WC一開(kāi)始就要有初始化unity的步驟。注意 自己創(chuàng)建的 main.swift 文件。還有就是Appdelegate里面的@UIApplicationMain 需要注銷(xiāo)。具體的步驟參考的步驟Nothing_lu的集成文章集成步驟的第十步。
這里其實(shí)可以寫(xiě)一個(gè)swift(iOS)工程的啟動(dòng)解析了。

  1. 報(bào)錯(cuò):Bulk_Assembly-CSharp_ 文件報(bào)錯(cuò)。


    Bulk_Assembly-CSharp_

Tip:這個(gè)里面說(shuō)明的是我們對(duì)一些函數(shù)并沒(méi)有定義,我個(gè)人對(duì)C C++ 并不是很擅長(zhǎng),看了幾篇文章,里面大概的意思是這個(gè)文件包裹了一些函數(shù)供后續(xù)的調(diào)用,如果出現(xiàn)了這個(gè)錯(cuò)誤,仔細(xì)觀察一下是什么前綴,此處圖中是GCloudVioce,后來(lái)才分析到是Unity里面添加了一個(gè)三方庫(kù),并沒(méi)有給到我。
解決:添加.a庫(kù)

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

解決:這里是調(diào)整了這里,選擇不用Metal。。 不知道有沒(méi)有好的方案。

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

解決: 這個(gè)問(wèn)題是一個(gè)小伙伴提出來(lái)的,是因?yàn)樗昧?Xcode 9 swift4.0 導(dǎo)致的,可能是語(yǔ)言有升級(jí)的關(guān)系 appdelegate 里面 修改一下這個(gè) @objc var currentUnityController: UnityAppController? 添加上objc!

Section 5 后續(xù)

1.如果你看到有問(wèn)題或者有好的解決方法,請(qǐng)留言告訴我。
2.如果你遇到問(wèn)題了,我盡量解答,因?yàn)檫@里面的坑太多了。
3.對(duì)你有幫助請(qǐng)留言告訴我。
4.沒(méi)有解決問(wèn)題也請(qǐng)讓我知道你來(lái)過(guò)這里。
5.生活不容易, 就像每次編譯這個(gè)工程 都需要 10分鐘以上。所以 這個(gè)文章一邊上班一邊寫(xiě)了好幾天。

參考文章
http://www.itdecent.cn/p/e8217896d6ff
http://www.cnblogs.com/fuunnyy/p/6227740.html
http://www.itdecent.cn/p/1a141e4fccb3

沒(méi)時(shí)間吐槽了,寫(xiě)了這個(gè)文章。當(dāng)做記錄。

=============================================
4.24 添加更新:主要是記錄一下 unity 小伙伴如果更新了 他們的版本然后我們這邊更換集成文件的主要步驟。

1.找到相應(yīng)的文件夾 替換 classes, Data,Libraries文件夾。工程里面最好是先刪除引用,然后再次導(dǎo)入.(classes,Libraries create groups
data 選擇 create folder references)

2.修改 classes/main.mm 里面的 main -> main_unity_default
UnityParseCommandLine -> UnityInitRuntime(這個(gè)不一定要換。囧~)


這個(gè)就是因?yàn)闆](méi)有修改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;
}

//替換成這個(gè)方法

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

5.各種庫(kù)文件找不到。 這個(gè)可能是因?yàn)闆](méi)有響應(yīng)的庫(kù)文件,檢查一下:


這里的庫(kù)文件.png

(如果你是用的pod 管理的 GVRSDK,那么這里應(yīng)該沒(méi)有不然會(huì)報(bào)很多沖突的錯(cuò)誤。)

8.記錄一下unity的配置情況


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

4.28 添加更新。(App里面 現(xiàn)在又添加了一個(gè) 百度語(yǔ)音的功能,我先暫時(shí)寫(xiě)到這里面,有時(shí)間會(huì)整理成另外一篇文章的。)

首先導(dǎo)入的 3方庫(kù) TTTAttributedLabel 這個(gè)要是用cocoapods 可以使用 1.6.1版本

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

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

后來(lái)問(wèn)了 Unity 的小伙伴得知應(yīng)該添加如下的代碼:(這段代碼說(shuō)是可以添加到工程的任何位置,iOS 的OC工程應(yīng)該是可以的,我選擇這里是因?yàn)槲业墓こ淌?swift 的工程,這里面肯定是運(yùn)行不了這個(gè)的具體的原因這里就不說(shuō)了,感興趣的可以去研究一下,囧~~)

//代碼定義區(qū)域 A
#if defined(__cplusplus)
extern "C"{
#endif
    
    //    個(gè)人資料聯(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的代碼中,如果哪個(gè)小伙伴有好的方式進(jìn)行交互可以留言告訴我~。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,086評(píng)論 4 61
  • 轉(zhuǎn)載自:https://github.com/Tim9Liu9/TimLiu-iOS[https://github...
    香橙柚子閱讀 9,140評(píng)論 0 36
  • 最近收了一個(gè)徒兒。 我們不去西天,也不去取經(jīng),但或許在人生路上可以互相取經(jīng)。 她問(wèn)我:師父,師母呢。你都這么大人了...
    十四先森閱讀 450評(píng)論 0 0
  • “失去身邊的誰(shuí)都是痛苦的,不論他們是人還是狗,都會(huì)在心里留有一個(gè)巨大的空洞?!?—《我們夢(mèng)中見(jiàn)》 大熊女友生日之前...
    未來(lái)回憶俱樂(lè)部閱讀 860評(píng)論 4 6
  • 周邊高層均價(jià)12000—13000二手 樓盤(pán)均價(jià)9500—11000 占地:2.2萬(wàn) 建面:5.4萬(wàn) 諸暨城東。東...
    吖跑跑熊閱讀 407評(píng)論 0 0

友情鏈接更多精彩內(nèi)容