從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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM