由于公司需求,需要把在iOS项目里添加unity工程,所以在网上搜索了资料和结合自己遇到的问题,做出的总结。
- 先删除项目里的 Main.storyboard 文件(据说是为了方便切换window)
- 先在自己项目里创建一个文件夹,用来存放unity文件,然后把unity项目里的Classes,Libraries,MapFileParser.sh拖入到项目(选中Copy items if needed, 选中Create groups)将Data拖入到项目(选中Copy items if needed, 选中Create folder references),如下图这样:
- 添加所需的framework:
- 添加 Header Search Paths、 Library Search Paths(直接show in finder拖文件进来就行)
- other C Flags -> -DINIT_SCRIPTING_BACKEND=1
- 添加User-Defined
- 设置key值:GCC_THUMB_SUPPORT,设置Value值:NO
- 设置key值:GCC_USE_INDIRECT_FUNCTION_CALLS,设置Value值:NO
- 设置key值:UNITY_RUNTIME_VERSION,设置Value值:5.4.3f1 (这里与你的unity项目的版本一致)
- 设置key值:UNITY_SCRIPTING_BACKEND,设置Value值: il2cpp
- 将Unity/Classes/Prefix.pch 的代码复制到项目里的pch文件(注意pch里有用到impot的都要用
#ifdef __OBJC__
#endif
给括起来,这是因为unity里的项目有很多cpp文件,等下会发生混编错误)
- 将Classes/main.mm全部内容复制到main.m 并把扩展名改为.mm, 然后删除Classes/main.mm文件,修改如下代码
- 在Build Phases,点+号,添加Run Script
- 修改UnityAppController.h如下代码
inline UnityAppController* GetAppController() { return (UnityAppController*)[[UIApplication sharedApplication] valueForKeyPath:@"delegate.unityController"]; }
- 在AppDelegate.h .m中添加如下代码
#import <UIKit/UIKit.h> #import "UnityAppController.h" @interface AppDelegate : UIResponder <UIApplicationDelegate> @property (strong, nonatomic) UIWindow *window; @property (strong, nonatomic) UIWindow *unityWindow; @property (strong, nonatomic) UnityAppController *unityController; - (void)showUnityWindow; - (void)hideUnityWindow;
#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. self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; self.window.backgroundColor = [UIColor whiteColor]; ViewController * vc = [[ViewController alloc]init]; self.window.rootViewController = vc; 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
-
把UnityAppController里的
改为UnityViewControllerBase* _viewControllerForOrientation[5];
UIViewController* _viewControllerForOrientation[5];
- 先在viewcontroller里切换到unity
#import "ViewController.h" #import "AppDelegate.h" @interface ViewController () @property(strong, nonatomic) UIButton *Btn; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; _Btn = [[UIButton alloc]initWithFrame:CGRectMake(40, 200, 80, 70)]; _Btn.backgroundColor = [UIColor cyanColor]; [_Btn setTitle:@"开启" forState:UIControlStateNormal]; [_Btn addTarget:self action:@selector(go) forControlEvents:UIControlEventTouchDown]; [self.view addSubview:_Btn]; // Do any additional setup after loading the view, typically from a nib. } -(void)go{ //进入unity界面 [(AppDelegate *)[UIApplication sharedApplication].delegate showUnityWindow]; UnityPause(false); } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
- 把导进项目unity里的所有.cpp文件的type改为Objectvie-C++ Source(避免出现混编错误)
- 最后编译运行
ps:如果编译还出现错误,可以参考下面大神的博客: