从iOS应用中,启动一个Unity App


文章前面的话:

下文是在13年写的,基于版本为:Unity 4.0 Xcode 4.6

当前开发工具已经过多个版本升级,所以有些地方可能已经与下文描述不符。

若有时间我回头使用新版做个demo,到时更新链接过来。评论可能无法一一回复,各位见谅。

====================正文分割线 ====================

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]];
    }
}

  

PS: 有错轻拍

  开发工具版本:Unity 4.0 Xcode 4.6

优质内容筛选与推荐>>
1、python小记(6)高阶函数
2、PreparedStatement传进null值报错
3、6/29 开荒笔记——STL map,STL queue
4、第一篇
5、jdk安装配置


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn