从iOS应用中,启动一个Unity App
Start a Unity app from inside a native iOS app
1. 首先,从Unity中将Unity项目导出Xcode工程。(因为Unity生成的工程目录比较麻烦,没有研究,所以从Unity生成工程的基础上进行开发)
2. 生成的Xcode工程包含以下文件。
其中main.mm文件,是项目的入口文件。
从代码来看。Unity是使用红色框中的文件(AppController)启动,没有用到蓝色框中的文件。所以我们可以直接使用(iPhone_targer2AppDelegate)
3. 修改入口文件,main.mm
将启动类,由“AppController”改为“NSStringFromClass([iPhone_target2AppDelegate class])”
| NSAutoreleasePool * pool = [NSAutoreleasePool new]; // UIApplicationMain(argc, argv, nil, @"AppController"); UIApplicationMain(argc, argv, nil, NSStringFromClass([iPhone_target2AppDelegate class])); [pool release]; |
4. 在“iPhone_target2AppDelegate”中,就可以正常的使用我们iOS项目了。
| - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; [self.window setRootViewController:[[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]]; [self.window makeKeyAndVisible]; return YES; } |
5. 接下来就是本文的重点了,怎么启动Unity项目呢。
| [[[AppController alloc] init] startUnity:[UIApplication sharedApplication]]; |
6. 从Unity项目退出,返回iOS项目。在AppController.mm中加入对Unity的响应,代码如下
这里使用了Unity和Object-C之间的代码交互。详见:http://alexanderwong.me/post/29861010648/call-objective-c-from-unity-call-unity-from
| extern "C" { float doExitSelector() { /* // 使用这个代码会导致应用Crash // ReleaseViewHierarchy(); // UnityCleanup(); */ // 所以在这里,使用以下方法:讲Unity暂停,隐藏项目,将iOS项目Window显示 UnityPause(true); _didResignActive = YES; Profiler_UninitProfiler(); [[[UnityGetMainWindow() rootViewController] view] setHidden:YES]; [[[iPhone_target2AppDelegate shareApplicationDelegate] window] makeKeyAndVisible]; return 0.0f; } } |
7. 最后注意一点,startUnity方法只能使用一次。多次调用同样会导致应用Crash,并报错:“should not be reached at domain.c”。
如果需要在Unity和iOS之间多次切换的话,可以在AppController.mm中加入以下方法
| - (void)restartUnity { [[[UnityGetMainWindow() rootViewController] view] setHidden:NO]; [UnityGetMainWindow() makeKeyAndVisible]; if (_didResignActive) UnityPause(false); _didResignActive = NO; } |
在需要的地方调用:
| - (void)onClickTest:(id)sender { if (appController) { [appController restartUnity]; }else { appController = [[AppController alloc] init]; [appController startUnity:[UIApplication sharedApplication]]; } } |
总结
以上是生活随笔为你收集整理的从iOS应用中,启动一个Unity App的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: iOS开发教程:Storyboard全解
- 下一篇: Unity3D研究院之IOS触摸屏手势控