Unity2018集成到IOS原生項(xiàng)目

\color{blue}寫在前面

????????? 我原本是做unity開發(fā)的,在工作中遇到需要將untiy集成到IOS原生項(xiàng)目中,對于IOS開發(fā),我不是很熟悉,準(zhǔn)確的說,應(yīng)該是門外漢級別,所幸經(jīng)過各種查找,各種試驗(yàn),終于讓我成功的講unity工程集成到了IOS原生項(xiàng)目中,這里對集成的流程做一個(gè)記錄,以便日后自己還能有個(gè)地方找到一點(diǎn)蛛絲馬跡,回憶過程.
????????? 特別感謝yotube上的視頻作者Swift Kat制作的視頻教程:傳送門由于眾所周知的原因,可能需要自己搭梯子
????????? 使用的版本: uniyt 2018.3.7f1 xcode版本為9.4.1(9F2000)

集成流程

Unity導(dǎo)出設(shè)置


需要注意的是不能使用unity默認(rèn)的AutoGraphicsAPI ,要選用OpenGLES2或者是OpenGLE3 ,有人說要保持Bundle identifier和IOS原生工程一樣,我做的時(shí)候是不一樣的,感覺不是很重要.下面是導(dǎo)出設(shè)置,和導(dǎo)出后的工程結(jié)構(gòu)


Xcode操作

  • Unity文件導(dǎo)入
    ????????? 需要導(dǎo)入到Xcode工程中的文件有\color{blue}{Classes,Libraries,Data}三個(gè)文件,有人說還需要導(dǎo)入MapFileParser.sh文件,但是我沒有導(dǎo)入也沒發(fā)現(xiàn)有什么影響(主要是對于ios太菜了),所以這里就不進(jìn)行導(dǎo)入.
    ????????? 其中對于Classes,和Libraries而言,導(dǎo)入設(shè)置如下


    ????????? 對于Data而言,導(dǎo)入設(shè)置為

    關(guān)于Copy items if needed選項(xiàng)可根據(jù)情況進(jìn)行勾選,該選項(xiàng)的勾選與否關(guān)系到后面對于路徑的設(shè)置.

  • Bulid Phases操作
    ????????? 在這個(gè)界面中,操作的重點(diǎn)就是對于庫文件的添加.如圖


    ????????? 差不多就是把unity導(dǎo)出的xcode工程中包含的所有庫如果在原生工程中沒有,那就全添加進(jìn)來,新添加進(jìn)來的庫的status要設(shè)置成和unity中一樣

  • Build Settings操作
    ????????? 在這個(gè)界面里面,主要是對引用路徑,和一些發(fā)布設(shè)置進(jìn)行操作主要操作項(xiàng)有



????????? 以上兩個(gè)位置對于路徑的設(shè)置受導(dǎo)入文件時(shí),是否勾選Copy items if needed的影響,略有不同,但整體的原則為需要包含的這幾個(gè)文件夾要能通過設(shè)置的這個(gè)路徑直接訪問到.






對于這個(gè).pch文件來說.如果原生工程中有這個(gè)文件,那么將導(dǎo)入的classes文件夾下的Prefix.pch中的內(nèi)容復(fù)制到原生工程中,如果不存在,可直接使用classes中的這個(gè)prefix.pch文件,**需要注意的是,要在prefix.pch中添加對UnityAppController.h頭文件的包含.如下圖












以上三項(xiàng)設(shè)置成和unity導(dǎo)出的工程一樣,其中UNITY_RUNTIME_VERSION 后面的值就是untiy的版本


至此設(shè)置層面的東西就完成了,剩下的就是代碼層面上的更改了

  • 初見代碼

????首先我們將classes文件夾下的main.mm中的所有內(nèi)容復(fù)制到原生工程的main.m中,并將這個(gè)main.m更名為main.mm搏恤。然后在Build Phases -> Compile Sources中搜索main.mm,這時(shí)候會看見有兩個(gè)main.mm文件住诸,將導(dǎo)入進(jìn)來的那個(gè)main.mm remove掉猾瘸。最后再原生工程的main.mm中找到 const char* AppControllerClassName = "UnityAppController" 更改為const char* AppControllerClassName = "AppDelegate"
????????努力到此秉馏,基本就快大功告成了,這個(gè)時(shí)候可以嘗試清理一下工程越走,然后點(diǎn)擊一下那個(gè)惹人愛的小三角蜜氨,如果一切順利蚜迅,那么就可以再你的設(shè)備上看見程序正常安裝,并跑起來了诬乞,雖然是一片雪白册赛,但至少是一個(gè)好的開始钠导。
????????一般來說你是不會順利的再這個(gè)時(shí)候走到安裝這一步的,很有可能會卡在link階段森瘪,報(bào)出一堆的錯(cuò)誤牡属。那么恭喜你,你也快成功了扼睬。
這個(gè)時(shí)候報(bào)錯(cuò)的大概率基本上會告訴你SetAllUnityFunctionsForDynamicPlayerLib XXXX DynamicLibEngineAPI.o逮栅,遇見這個(gè)錯(cuò)誤,你需要在導(dǎo)入的Classes中去找如下兩個(gè)文件窗宇,然后\color{red}{徹底刪除}掉措伐,接下來再清理工程,試試那個(gè)小三角军俊,這個(gè)時(shí)候你的運(yùn)氣應(yīng)該會好很多侥加,(*^-^*)

  • 搞定跳轉(zhuǎn)
    AppDelegate.h
#import <UIKit/UIKit.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>

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

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

@end

AppDelegate.m

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

@interface AppDelegate ()

@end

@implementation AppDelegate

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

-(void) showUnityWindow
{
    [self.unityWindow makeKeyAndVisible];
}

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

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

- (void)applicationWillResignActive:(UIApplication *)application {
    [self.unityController applicationWillResignActive:application];
}


- (void)applicationDidEnterBackground:(UIApplication *)application {
    [self.unityController applicationDidEnterBackground:application];
}


- (void)applicationWillEnterForeground:(UIApplication *)application {
    [self.unityController applicationWillEnterForeground:application];
}


- (void)applicationDidBecomeActive:(UIApplication *)application {
    [self.unityController applicationDidBecomeActive:application];
}


- (void)applicationWillTerminate:(UIApplication *)application {
    [self.unityController applicationWillTerminate:application];
}


@end

ViewController.m

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

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    UIButton* mb = [UIButton buttonWithType:UIButtonTypeSystem];
    mb.frame = CGRectMake(10, 10, 200, 200);
    [mb setBackgroundColor:[UIColor redColor]];
    [mb setTitle:@"Open Unity" forState:UIControlStateNormal];
    [mb addTarget:self action:@selector(GoUnity) forControlEvents:UIControlEventTouchDown];
    [self.view addSubview:mb];
}

-(void) GoUnity
{
    AppDelegate* delegate = (AppDelegate*) [UIApplication sharedApplication].delegate;
    [delegate showUnityWindow];
    NSLog(@"Open Unity");
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


@end

完結(jié)撒花

????????至此unity集成到ios工程中就完成了,這里只是一個(gè)簡單的跳轉(zhuǎn)蝇完,我不知道在后面是否還會遇見其他其他的問題官硝,但愿這一個(gè)好的開始,能讓我順利搞完接下來的問題短蜕。
????????也許有大佬知道其中一些細(xì)節(jié)上的問題氢架,愿意指點(diǎn)一二,吾將銘記于心朋魔,心存感念岖研。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市警检,隨后出現(xiàn)的幾起案子孙援,更是在濱河造成了極大的恐慌,老刑警劉巖扇雕,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拓售,死亡現(xiàn)場離奇詭異,居然都是意外死亡镶奉,警方通過查閱死者的電腦和手機(jī)础淤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哨苛,“玉大人鸽凶,你說我怎么就攤上這事〗ㄇ停” “怎么了玻侥?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長亿蒸。 經(jīng)常有香客問我凑兰,道長掌桩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任票摇,我火速辦了婚禮拘鞋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘矢门。我一直安慰自己盆色,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布祟剔。 她就那樣靜靜地躺著隔躲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪物延。 梳的紋絲不亂的頭發(fā)上宣旱,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天,我揣著相機(jī)與錄音叛薯,去河邊找鬼浑吟。 笑死,一個(gè)胖子當(dāng)著我的面吹牛耗溜,可吹牛的內(nèi)容都是我干的组力。 我是一名探鬼主播,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼抖拴,長吁一口氣:“原來是場噩夢啊……” “哼燎字!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起阿宅,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤候衍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后洒放,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛉鹿,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年往湿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了榨为。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,021評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡煌茴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出日川,到底是詐尸還是另有隱情蔓腐,我是刑警寧澤,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布龄句,位于F島的核電站回论,受9級特大地震影響散罕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜傀蓉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一欧漱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧葬燎,春花似錦误甚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至壕探,卻和暖如春冈钦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背李请。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工瞧筛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人导盅。 一個(gè)月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓较幌,卻偏偏與公主長得像,于是被迫代替她去往敵國和親认轨。 傳聞我的和親對象是個(gè)殘疾皇子绅络,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評論 2 355

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