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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值