Unity導出Xcode工程集成進另一個原生Xcode工程

最近用`Unity2017`打包的文件嵌入到現(xiàn)有`iOS`工程中發(fā)現(xiàn)也是可以的,更加方便侯嘀。出現(xiàn)的問題在最底下已經(jīng)解決偏窝。

因為現(xiàn)有項目有個功能需要調(diào)用Unity頁面,所以就叫同事用Unity打一個包給我嵌入到現(xiàn)有iOS工程究孕,就一個導入過程就非常曲折比搭。(淚奔~~o(>_<)o ~~)

以下所有的文件結(jié)構(gòu)和TARGETS配置都是參考Unity導出來的工程結(jié)構(gòu)和配置冠跷,后面所有的刪除都是刪除引用。

1,首先將導出的包跑一下看看能不能跑起來(注意打出來的包是否支持模擬器運行)蜜托,能跑起來才做下面的將Unity項目下面的四個文件復(fù)制到iOS項目的根目錄

Unity打包出來的包

復(fù)制到iOS的項目后的目錄如下:

復(fù)制到iOS項目后的目錄結(jié)構(gòu)

2弟疆,在自己iOS項目中引用這幾個文件,但是引用跟我們平時引用的不一樣,右鍵Add Files to ···分別選擇ClassesLibraries 盗冷、MapFileParser.sh,在Options里面勾選 Create groups同廉,不要選Copy items if needed

引用文件

2.1仪糖,剩下的Data文件,右鍵Add Files to ···迫肖,在Options里面勾選 Create folder references锅劝,不要選Copy items if needed

Data導入

完成之后的文件夾目錄如下:


目錄,以這個為準

2.2蟆湖,接下來刪除多余的引用:

Classes->Native目錄故爵,將目錄下的.h文件全部刪除(注意:只刪除引用,而且只有.h隅津,因為里面還有.cpp诬垂,據(jù)說Unity2017不用刪除,但是我還沒有測試成功)

2.2

2.3伦仍,再刪除Libraries->libil2cpp,這個文件的引用结窘,同上面操作步驟一樣的

2.3

3,對iOS工程環(huán)境的配置,這里的配置都是以Unity的配置為參考

3.1充蓝,添加應(yīng)用庫

3.1

3.2隧枫,添加頭文件和庫的搜索路徑

3.2

每一個項目的配置和路徑不一樣,這里只是參考谓苟,一切以你Unity項目的配置為準
2.41

3.3官脓,其它一些配置

3.3.1

3.3.2
3.3.3

3.3.4

3.3.5

3.3.6

上面注意:如果自己的iOS項目有pch文件,那就把Prefix.pch里面的文件拷貝到自己的pch文件中涝焙,反之也行(注意pch路徑)卑笨,并添加#import"UnityAppController.h"
pch文件

3.3.7

3.4,添加用戶定義的設(shè)置(這個圖是我用Unity2017來試的時候截的圖仑撞,但是失敗了湾趾,5.6可以)

3.4

4,修改main.m文件

Classes/文件夾里面的main.mm里面的代碼派草,拷貝到Supporting Files/下的main.m文件中搀缠,并把后綴改成.mm,修改如下圖

4

然后刪除Classes目錄下單main.mm文件近迁。注意:一樣是刪除引用
到了這里基本集成完畢了~~~

5艺普,修改AppDelegate 文件

AppDelegate.h文件

#import <UIKit/UIKit.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UnityAppController * unityController;
@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) UIWindow * unityWindow;

- (void)showUnityWindow;
- (void)hideUnityWindow;


@end

AppDelegate.m文件

#import "AppDelegate.h"
#import "ViewController.h"

@interface AppDelegate ()

@end

@implementation AppDelegate

- (UIWindow *)unityWindow {
    return UnityGetMainWindow();
}

- (void)showUnityWindow {
    
    UIButton * btn = [UIButton buttonWithType:UIButtonTypeSystem];
    [btn setTitle:@"返回iOS世界" forState:UIControlStateNormal];
    [btn setFrame:CGRectMake(100, 100, 100, 40)];
    [btn addTarget:self action:@selector(hideUnityWindow) forControlEvents:UIControlEventTouchUpInside];
    [self.unityWindow addSubview:btn];
    
    [self.unityWindow makeKeyAndVisible];
}

- (void)hideUnityWindow {
    [self.window makeKeyAndVisible];
}


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    self.window.backgroundColor = [UIColor whiteColor];
    UINavigationController * nav = [[UINavigationController alloc] initWithRootViewController:[[ViewController alloc] init]];
    
    self.window.rootViewController = nav;
    self.unityController = [[UnityAppController alloc] init];
    [self.unityController application:application didFinishLaunchingWithOptions:launchOptions];
    [self.window makeKeyAndVisible];
    
    return YES;
}


- (void)applicationWillResignActive:(UIApplication *)application {
    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
    // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
    [_unityController applicationWillResignActive:application];
}


- (void)applicationDidEnterBackground:(UIApplication *)application {
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
    [_unityController applicationDidEnterBackground:application];
}


- (void)applicationWillEnterForeground:(UIApplication *)application {
    // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
    [_unityController applicationWillEnterForeground:application];
}


- (void)applicationDidBecomeActive:(UIApplication *)application {
    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
    [_unityController applicationDidBecomeActive:application];
}


- (void)applicationWillTerminate:(UIApplication *)application {
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
    [_unityController applicationWillTerminate:application];
}

@end

6,修改UnityAppController.h文件

#import "AppDelegate.h"

inline UnityAppController*  GetAppController()
{
    AppDelegate * delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    return delegate.unityController;
//    return (UnityAppController*)[UIApplication sharedApplication].delegate;
}

7,啟動Unity界面

進入Unity界面

[(AppDelegate *)[UIApplication sharedApplication].delegate showUnityWindow];
UnityPause(false);

跳出Unity界面

[(AppDelegate*)[UIApplication sharedApplication].delegate  hideUnityWindow];
UnityPause(true);

8歧譬,一些報錯匯總:

1岸浑,報錯:libil2cpp/include/codegen/il2cpp-codegen.h:368:1: Control may reach end of non-void function 
添加 return NULL;
2,編譯時遇到Permission denied錯誤的是因為當前開發(fā)賬號對項目目錄沒有權(quán)限執(zhí)行MapFileParser.sh
解決方法:chmod +x   /Users/......./MapFileParser.sh (MapFileParser.sh所在的目錄)
3瑰步,clang: error: no such file or directory: 'CoreMotion'矢洲,注意Other Linker Flags的導入的順序
4,加了extern "c",卻不認識缩焦,一直報少“(”读虏,在Build Settings選項中找到Compile Sources As這項設(shè)置成Objective-C++ 就解決問題了 
5,最近使用Unity2017打包的導入發(fā)現(xiàn)出現(xiàn)如下錯誤
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Storyboard (<UIStoryboard: 0x146746d0>) doesn't contain a view controller with identifier 'unitySplashStoryboard''
解決辦法如下:在SplashScreen.mm文件修改下面的方法
void ShowSplashScreen(UIWindow* window)
{
//    bool hasStoryboard = [[NSBundle mainBundle] pathForResource: @"LaunchScreen" ofType: @"storyboardc"] != nullptr;
//
//    if (hasStoryboard)
//    {
//        UIStoryboard *storyboard = [UIStoryboard storyboardWithName: @"LaunchScreen" bundle: [NSBundle mainBundle]];
//        _controller = [storyboard instantiateViewControllerWithIdentifier: @"unitySplashStoryboard"];
//    }
//    else
        _controller = [[SplashScreenController alloc] init];

    [_controller create: window];
    [window makeKeyAndVisible];
}

最后感謝這兩位作者的引導文章:
Unity(2017版本)嵌入現(xiàn)有iOS工程
unity與iOS合并
iOS (Swift)集成 Unity步驟和各種填坑袁滥。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末盖桥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子题翻,更是在濱河造成了極大的恐慌揩徊,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嵌赠,死亡現(xiàn)場離奇詭異塑荒,居然都是意外死亡,警方通過查閱死者的電腦和手機姜挺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門袜炕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人初家,你說我怎么就攤上這事偎窘。” “怎么了溜在?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵陌知,是天一觀的道長。 經(jīng)常有香客問我掖肋,道長仆葡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任志笼,我火速辦了婚禮沿盅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘纫溃。我一直安慰自己腰涧,他們只是感情好,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布紊浩。 她就那樣靜靜地躺著窖铡,像睡著了一般疗锐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上费彼,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天滑臊,我揣著相機與錄音,去河邊找鬼箍铲。 笑死雇卷,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的颠猴。 我是一名探鬼主播关划,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼芙粱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起氧映,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤春畔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后岛都,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體律姨,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年臼疫,在試婚紗的時候發(fā)現(xiàn)自己被綠了择份。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡烫堤,死狀恐怖荣赶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鸽斟,我是刑警寧澤拔创,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站富蓄,受9級特大地震影響剩燥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜立倍,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一灭红、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧口注,春花似錦变擒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽葛躏。三九已至,卻和暖如春悠菜,著一層夾襖步出監(jiān)牢的瞬間舰攒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工悔醋, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留摩窃,地道東北人。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓芬骄,卻偏偏與公主長得像猾愿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子账阻,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

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

  • Unity項目集成到現(xiàn)有iOS項目 1.將Unity項目文件復(fù)制到到iOS項目跟目錄下 主要有5個文件蒂秘,Class...
    _Homing_C閱讀 6,230評論 17 12
  • 今天的這本書很有意思,東方思維和管理的極好結(jié)合淘太,對于物理學精神的運用也很精妙姻僧,值得我們在生活中學習!一定要追求平衡...
    SabrinaFang方興閱讀 346評論 0 1
  • 寫在之前的話:兩情若是長久時,又豈在朝朝暮暮 (一) 有的人有緣無分冰抢,而有的人卻一見鐘情松嘶,我和你可能恰巧就屬于這種...
    咿呀涵丫閱讀 229評論 0 2
  • 朋友的孩子大學畢業(yè)了翠订。為了給他創(chuàng)造個好的發(fā)展空間,朋友就委托我留意下遵倦,如果北京有合適的單位蕴轨,就把孩子推薦過去。孩子...
    微言微評閱讀 449評論 0 0
  • 題記:最近迷上漢服骇吭,從內(nèi)心深處的喜歡橙弱,總有一種相見恨晚的感覺。關(guān)注了十幾家漢服店燥狰,每天晚上總會去逛逛棘脐,又關(guān)注了幾個...
    莉莉安lilianan閱讀 1,891評論 0 0