近年来iOS和Unity发展都非常迅速,而iOS和Unity都有各自擅长的领域,iOS在传统应用开发的中坚力量,而Unity在游戏行业发展强劲,尤其是三维领域。作为可视化项目,我们既需要传统项目的功能模块,又需要三维场景的渲染效果,所以我们今天要把这两个领域的强者融合在一起,在一个项目中发挥各自所长。iOS集成Unity在现实中应用较少,几乎没有完整流程的资料,且其中的坑数不胜数,所以把这些内容整理出来提供给大家。 下面详细介绍下打包流程。
1.打包Unity并导入
Unity中打包iOS包
首先在Unity编辑器打开UnityProject项目,选择Menu -> Window -> Package Manager,因为2.0.8版本不兼容使用Unity作为库,所以要移除Ads资源包,或更新Ads资源包到v 3.*版本。
选择Menu -> Edit -> Player Settings -> Player -> iOS设置标签页 -> Identification Section,设置有效的Bundle Identification和Signing Team ID,以避免后续步骤出现Xcode签名问题。
打开Menu -> File -> Builds Settings,在此选择并切换平台为iOS。将UnityProject项目构建到iosBuild文件夹。
一般Unity导出的iOS工程是可以直接运行的,但是我们既然要集成Unity,只是需要其中的三个文件,分别是Data、Classes、Libraries。
接下来就是修改导出包的文件。
1.文件:main.mm
复制替换:
int main_unity_default(int argc, char* argv[]){
@autoreleasepool{
UnityInitTrampoline();
// UnityParseCommandLine(argc, argv); //Unity 5.3+
UnityInitRuntime(argc, argv); //Unity 5.6+,5.4和5.5用哪个我没试过,可以根据报错情况选择。
RegisterMonoModules();
NSLog(@"-> registered mono modules %p\n", &constsection);
RegisterFeatures();
std::signal(SIGPIPE, SIG_IGN);
//UIApplicationMain(argc, argv, nil, [NSString stringWithUTF8String:AppControllerClassName]);
// UIApplicationMain(argc, argv, nil, NSStringFromClass([UnitySubAppDelegate class]));
UIApplicationMain(argc, argv, nil, [NSString stringWithUTF8String:AppControllerClassName]);
}
return 0;
}
2.文件:UnityAppController.h
导入文件:#import <UIKit/UIKit.h>
复制替换:
NS_INLINE UnityAppController* GetAppController(){
NSObject<UIApplicationDelegate>* delegate = [UIApplication sharedApplication].delegate;
UnityAppController* currentUnityController = (UnityAppController *)[delegate valueForKey:@"currentUnityController"];
return currentUnityController;
}
3.文件:SplashScreen.mm
复制替换:
void ShowSplashScreen(UIWindow* window)
{
_controller = [[SplashScreenController alloc] init];
[_controller create: window];
}
4.文件:DeviceSettings.mm
代码行数:268
复制替换:
return deviceUnknown;
5.文件:CrashReporter.mm
代码行数:81
复制替换:
InitCrashReporter();
导入
为了方便管理,我们可以在我们iOS工程主目录下创建一个文件夹,专门来存放Unity文件,方便管理和维护。比如我们起名为unity。Classes和Libraries以create groups的方式导入进来,而Data文件以Create folder references的形式导入进来。
4.文件:DeviceSettings.mm
代码行数:268
复制替换:
return deviceUnknown;
5.文件:CrashReporter.mm
代码行数:81
复制替换:// InitCrashReporter();
导入
为了方便管理,我们可以在我们iOS工程主目录下创建一个文件夹,专门来存放Unity文件,方便管理和维护。比如我们起名为unity。Classes和Libraries以create groups的方式导入进来,而Data文件以Create folder references的形式导入进来。