我原本是做unity开发的,在工作中遇到需要将untiy集成到IOS原生项目中,对于IOS开发,我不是很熟悉,准确的说,应该是门外汉级别,所幸经过各种查找,各种试验,终于让我成功的讲unity工程集成到了IOS原生项目中,这里对集成的流程做一个记录,以便日后自己还能有个地方找到一点蛛丝马迹,回忆过程.
特别感谢yotube上的视频作者Swift Kat制作的视频教程:传送门由于众所周知的原因,可能需要自己搭梯子
使用的版本: uniyt 2018.3.7f1 xcode版本为9.4.1(9F2000)
集成流程
Unity导出设置
需要注意的是不能使用unity默认的AutoGraphicsAPI ,要选用OpenGLES2或者是OpenGLE3 ,有人说要保持Bundle identifier和IOS原生工程一样,我做的时候是不一样的,感觉不是很重要.下面是导出设置,和导出后的工程结构
Xcode操作
-
Unity文件导入
需要导入到Xcode工程中的文件有三个文件,有人说还需要导入MapFileParser.sh文件,但是我没有导入也没发现有什么影响(主要是对于ios太菜了),所以这里就不进行导入.
其中对于Classes,和Libraries而言,导入设置如下
对于Data而言,导入设置为
关于Copy items if needed选项可根据情况进行勾选,该选项的勾选与否关系到后面对于路径的设置. -
Bulid Phases操作
在这个界面中,操作的重点就是对于库文件的添加.如图
差不多就是把unity导出的xcode工程中包含的所有库如果在原生工程中没有,那就全添加进来,新添加进来的库的status要设置成和unity中一样
-
Build Settings操作
在这个界面里面,主要是对引用路径,和一些发布设置进行操作主要操作项有
以上两个位置对于路径的设置受导入文件时,是否勾选Copy items if needed的影响,略有不同,但整体的原则为需要包含的这几个文件夹要能通过设置的这个路径直接访问到.
对于这个.pch文件来说.如果原生工程中有这个文件,那么将导入的classes文件夹下的Prefix.pch中的内容复制到原生工程中,如果不存在,可直接使用classes中的这个prefix.pch文件,**需要注意的是,要在prefix.pch中添加对UnityAppController.h头文件的包含.如下图
以上三项设置成和unity导出的工程一样,其中UNITY_RUNTIME_VERSION 后面的值就是untiy的版本
至此设置层面的东西就完成了,剩下的就是代码层面上的更改了
- 初见代码
首先我们将classes文件夹下的main.mm中的所有内容复制到原生工程的main.m中,并将这个main.m更名为main.mm。然后在Build Phases -> Compile Sources中搜索main.mm,这时候会看见有两个main.mm文件,将导入进来的那个main.mm remove掉。最后再原生工程的main.mm中找到 const char* AppControllerClassName = "UnityAppController" 更改为const char* AppControllerClassName = "AppDelegate"
努力到此,基本就快大功告成了,这个时候可以尝试清理一下工程,然后点击一下那个惹人爱的小三角,如果一切顺利,那么就可以再你的设备上看见程序正常安装,并跑起来了,虽然是一片雪白,但至少是一个好的开始。
一般来说你是不会顺利的再这个时候走到安装这一步的,很有可能会卡在link阶段,报出一堆的错误。那么恭喜你,你也快成功了。
这个时候报错的大概率基本上会告诉你SetAllUnityFunctionsForDynamicPlayerLib XXXX DynamicLibEngineAPI.o,遇见这个错误,你需要在导入的Classes中去找如下两个文件,然后掉,接下来再清理工程,试试那个小三角,这个时候你的运气应该会好很多,(*^-^*)
-
搞定跳转
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;
}
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
完结撒花
至此unity集成到ios工程中就完成了,这里只是一个简单的跳转,我不知道在后面是否还会遇见其他其他的问题,但愿这一个好的开始,能让我顺利搞完接下来的问题。
也许有大佬知道其中一些细节上的问题,愿意指点一二,吾将铭记于心,心存感念。
网友评论