iOS集成Unity

458 阅读2分钟

近年来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的形式导入进来。

截屏2022-03-24 下午5.49.21.png