????????? 我原本是做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工程中的文件有三個(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è)文件窗宇,然后掉措伐,接下來再清理工程,試試那個(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)一二,吾將銘記于心朋魔,心存感念岖研。