前言
觀(guān)看以下內(nèi)容前請(qǐng)安靜的看完這段:
有個(gè)項(xiàng)目中途開(kāi)發(fā)到一半,突然需要接入AR功能,過(guò)程中遇到挺多坑以及擔(dān)憂(yōu)的球化,所以寫(xiě)下此章秽晚,不讓大家繼續(xù)往坑里掉。
開(kāi)發(fā)中的iOS項(xiàng)目使用workspace管理筒愚、第三方使用pod導(dǎo)入赴蝇,采用了OC與Swift混編。前期使用x-code8.3.3巢掺,后面使用x-code9開(kāi)發(fā)句伶,以下所有操作均在x-code9版本基礎(chǔ)上,所以不必?fù)?dān)心iOS配置不兼容Unity導(dǎo)出的Xcode工程等問(wèn)題陆淀。
Unity實(shí)現(xiàn)AR功能使用了第三方SDK--HiAR(這是啥考余,大家可以去百度),據(jù)了解市面上還有easyAR(這又是啥轧苫,大家繼續(xù)去百度)楚堤,本文中介紹的Unity導(dǎo)出的Xcode工程帶有的是HiAR,如果你使用的是easyAR含懊,也是適用的身冬,請(qǐng)不用擔(dān)心,不過(guò)easyAR容易出現(xiàn)攝像頭黑屏的情況岔乔。
集成步驟
1.Unity導(dǎo)出工程時(shí)設(shè)置bundle id要與項(xiàng)目一致(本人測(cè)試結(jié)果吏恭,可以不一致)
2.修改bit code為NO
3.刪除Main.storyboard,代碼設(shè)置控制器(方便切換window)
4.我們先來(lái)看一下Unity導(dǎo)出的Xcode工程
5.新建一個(gè)AR文件夾(所有從Unity導(dǎo)出的Xcode工程copy出的資源都保存在此,可自由變更文件夾名的重罪,但后續(xù)的路徑記得配置正確)樱哼,將Classes,Libraries,MapFileParser.sh拖入到項(xiàng)目(選中Copy items if needed,選中Create groups)
MapFileParser文件記得拖進(jìn)AR文件夾下,不用引用但必須有剿配!
將Data拖入到項(xiàng)目(選中Copy items if needed,選中Create folder references)搅幅,新建AR文件夾方便導(dǎo)入管理,如圖:
6.x-code9開(kāi)發(fā)版本存在bug呼胚,所以需要做如下操作茄唐,版本以下請(qǐng)忽略:
? ? 6.1添加Data文件
? ?6.2添加所有的.cpp? .mm
7.添加framework,不要遺漏了蝇更,靜態(tài)庫(kù)的引用在A(yíng)R-Library目錄下沪编,使用Add Other link添加
8.添加Header Search Paths和Library Search Paths,如果文件名AR更改了年扩,記得替換文件名
9.other C Flags -> -DINIT_SCRIPTING_BACKEND=1蚁廓,如果你項(xiàng)目這里已經(jīng)存在好多設(shè)置了,把這個(gè)新增設(shè)置移動(dòng)到最頂部
10.添加User-Defined (UNITY_RUNTIME_VERSION版本號(hào)與導(dǎo)出工程的Unity版本號(hào)一致)厨幻,此操作可以參考Unity導(dǎo)出的Xcode工程配置相嵌,不用自己手動(dòng)敲
11.Unity/Classes/Prefix.pch的代碼復(fù)制到新建的pch文件, 設(shè)置pch文件路徑
12.將Classes/main.mm全部?jī)?nèi)容復(fù)制到main.m 并把擴(kuò)展名改為.mm, 修改如下代碼
13.添加Run Script
14. 修改UnityAppController.h如下代碼
15.在A(yíng)ppDelegate.h .m中添加如下代碼
16.啟動(dòng)AR代碼
//ar界面
[(AppDelegate *)[UIApplication sharedApplication].delegate unityWindow].rootViewController.view.frame = [(AppDelegate *)[UIApplication sharedApplication].delegate window].bounds;
[[(AppDelegate *)[UIApplication sharedApplication].delegate window] addSubview:[(AppDelegate *)[UIApplication sharedApplication].delegate unityWindow].rootViewController.view];
UnityPause(false);
17.關(guān)閉AR代碼
//推出Unity界面
[[(AppDelegate *)[UIApplication sharedApplication].delegate unityWindow].rootViewController.view removeFromSuperview];
UnityPause(true);
18.AR交互代碼示例
1腿时、iOS調(diào)用unity方法
CPNFloatButton.m中示例代碼
NSString*sendMsg =@"ios to unity";
UnitySendMessage("Plane","sayHi",[sendMsgUTF8String]);
PS:此類(lèi)方法可以寫(xiě)在.m任意類(lèi)中,三個(gè)參數(shù)是必傳的饭宾,Plane跟"sayHi"必須跟unity保持一致批糟。
2、unity調(diào)用iOS方法
UnityAppController.mm示例代碼如下:
extern"C"voidshareAction(constchar*imageUrl){
//這里寫(xiě)實(shí)現(xiàn)
NSLog(@"shareAction");
NSString *strNSString;
if(imageUrl) {
strNSString = [[NSString alloc]initWithUTF8String:imageUrl];
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
[usersetObject:strNSStringforKey:@"AR_imageUrl"];
[user synchronize];
NSDictionary *dict =[[NSDictionary alloc] initWithObjectsAndKeys:@"小明",@"name",@"111401",@"number",nil];
[[NSNotificationCenter defaultCenter] postNotificationName:@"shareAction"object:dict];
}
NSLog(@"傳回來(lái)的路徑===>%@",strNSString);
}
extern"C"voidexitAction(){
//這里寫(xiě)實(shí)現(xiàn)
NSLog(@"exitAction");
[[NSNotificationCenter defaultCenter] postNotificationName:@"exitAction"object:nil];
}
extern"C"voidgoAction(constchar*url){
//這里寫(xiě)實(shí)現(xiàn)
NSLog(@"goAction");
NSString *strNSString;
if(url) {
strNSString = [[NSString alloc]initWithUTF8String:url];
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
[usersetObject:strNSStringforKey:@"AR_url"];
[user synchronize];
[[NSNotificationCenter defaultCenter] postNotificationName:@"goAction"object:nil];
}
NSLog(@"傳回來(lái)的地址===>%@",strNSString);
}
PS:unity調(diào)用iOS寫(xiě)了幾個(gè)方法看铆,iOS就必須提供調(diào)用的方法徽鼎,否則編譯會(huì)報(bào)錯(cuò)的,而且此類(lèi)方法只能寫(xiě)在.mm文件中弹惦。
具體參考:http://blog.csdn.net/huayu_huayu/article/details/51822971
可能有人會(huì)問(wèn)為什么這樣啟動(dòng)AR以及關(guān)閉AR纬傲,而不是去切換Window呢,其一切換Window會(huì)崩潰肤频,其二使用通知交互有問(wèn)題叹括。
PS:在集成過(guò)程中可能遇到的報(bào)錯(cuò)以及解決辦法,這個(gè)一定要看宵荒,因?yàn)檫@涉及到build setting里面的設(shè)置汁雷,特別是最后一個(gè)設(shè)置,我集成的過(guò)程中一直卡在HIAR的SDK無(wú)法編譯問(wèn)題报咳。
1.報(bào)錯(cuò)Control reaches end of non-void function侠讯,解決辦法:把Mismatched Return Type改為NO
2.報(bào)錯(cuò)↓
解決方案↓
3.報(bào)錯(cuò)↓
解決方案↓
比較尷尬的是VideoPlayer重名了,得修改本地的VideoPlayer修改為JKVideoPlayer暑刃,搜索#import "VideoPlayer.h"替換使用過(guò)的方法
4.報(bào)錯(cuò)↓
解決方案↓
至此祝編譯成功......希望能幫到你.....
可能你的項(xiàng)目在開(kāi)發(fā)厢漩,untiy的代碼也還在開(kāi)發(fā),你們需要不斷的集成打包測(cè)試岩臣,那么恭喜你溜嗜,你只需要移除AR文件夾的5個(gè)文件,繼續(xù)參考步驟6.
參考鏈接1:http://blog.csdn.net/huayu_huayu/article/details/51822971
參考鏈接2:http://blog.csdn.net/dylan_lwb_/article/details/51452470
謝謝以上作者架谎。