iOS工程與unity相互調(diào)起、交互、傳值

好長時間沒有寫了,一直忙沒來得及寫,繼續(xù)把上篇已經(jīng)實現(xiàn)了將Unity導(dǎo)出的工程集成到原生iOS項目中了,接下來實現(xiàn)與Unity相互切換、調(diào)起、傳值。

需要注意的是,Unity一旦初始化,是不能關(guān)閉的,否則App直接就會被關(guān)閉。所以,一旦調(diào)起Unity,內(nèi)存就不會降下來了。第一次啟動會比較慢,之后就很快了。另外,集成Unity之后,就只能真機運行了。

1、之前我們已經(jīng)在pch中import了UnityAppController,所以其他地方不用再import了。所有的接口建議寫在AppDelegate中。

首先,將AppDelegate.m改名為AppDelegate.mm ,然后,在AppDelegate.h中,如下


#import <UIKit/UIKit.h>

@class UnityAppController;

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

@property (strong, nonatomic) UIWindow *unityWindow;

@property (strong, nonatomic) UnityAppController *unityController;

- (void)showUnityWindow;

- (void)hideUnityWindow;

- (void)shouldAttachRenderDelegate;

@end

接下來,修改AppDelegate.mm 如有報錯,先暫時忽略

#import "AppDelegate.h"

@interface AppDelegate ()
{
    //這里的兩個BOOL,是用來區(qū)分,是否第一次加載Unity,以及Unity視圖是否出現(xiàn)
    BOOL _notFirstShow;
    BOOL _isShowing;
}
@end

@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.backgroundColor = [UIColor whiteColor];
    
    self.unityController = [[UnityAppController alloc]init];
    [self.unityController application:application didFinishLaunchingWithOptions:launchOptions];
}
- (void)shouldAttachRenderDelegate {}
- (void)showUnityWindow {
    
    
    if (!_notFirstShow) {
        //第一次啟動
        [self.unityController startUnityFirstTime];
        _notFirstShow = YES;
    } else {
        //已經(jīng)初始化
        [self.unityController startUnityOtherTime];
        
    }
    _isShowing = YES;
    
}
- (void)hideUnityWindow {
    [self.unityController doExitSelector];
    //看到這里就明白了,我用的是模態(tài)的方式展示的~哈哈哈
    [self.window.rootViewController dismissViewControllerAnimated:YES completion:nil];
    _isShowing = NO;
}

- (void)applicationWillResignActive:(UIApplication *)application {
    [self.unityController applicationWillResignActive:application];
    
}

- (void)applicationDidEnterBackground:(UIApplication *)application {
    
    [self.unityController applicationDidEnterBackground:application];
    
    _backgroundView = [Util createSnapShotView];
    [self.window addSubview:_backgroundView];
    
}

- (void)applicationWillEnterForeground:(UIApplication *)application {
    [self.unityController applicationWillEnterForeground:application];
    
}

- (void)applicationDidBecomeActive:(UIApplication *)application {
    [self.unityController applicationDidBecomeActive:application];
    
    if (_backgroundView != nil) {
        [_backgroundView removeFromSuperview];
        _backgroundView = nil;
    }
    
    if (_notFirstShow && !_isShowing) {
        //如果unity處于暫停狀態(tài),從后臺喚醒時也要保持暫停狀態(tài)
        [self.unityController doExitSelector];
    }
    
}

- (void)applicationWillTerminate:(UIApplication *)application {
    [self.unityController applicationWillTerminate:application];
    
}

@end

現(xiàn)在來修改UnityAppController.h,添加如下方法

//自定義開啟關(guān)閉Unity
- (void)startUnityFirstTime;
- (void)startUnityOtherTime;
- (void)doExitSelector;

找到下面這個方法

inline UnityAppController*  GetAppController()
{
    return (UnityAppController*)[UIApplication sharedApplication].delegate;
}

替換成如下

inline UnityAppController*  GetAppController()
{
//    return (UnityAppController*)[UIApplication sharedApplication].delegate;
    AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    return delegate.unityController;
}

接下來修改UnityAppController.mm
在它引用頭文件的最后一行,引入自定義控制器#import "GameViewController.h" 為了放unity,如果沒有,創(chuàng)建一個
接下來找到方法

- (void)shouldAttachRenderDelegate  {}

實現(xiàn)這個方法

- (void)shouldAttachRenderDelegate  {
    AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    [delegate shouldAttachRenderDelegate];
}

找到如下方法

- (void)applicationDidBecomeActive:(UIApplication*)application
{
    ::printf("-> applicationDidBecomeActive()\n");

    [self removeSnapshotView];

    if (_unityAppReady)
    {
        if (UnityIsPaused() && _wasPausedExternal == false)
        {
            UnityWillResume();
            UnityPause(0);
        }
        UnitySetPlayerFocus(1);
    }
    else if (!_startUnityScheduled)
    {
        _startUnityScheduled = true;
        [self performSelector: @selector(startUnity:) withObject: application afterDelay: 0];
    }

    _didResignActive = false;
}

改成如下

//首先在這個方法上面聲明一個bool變量
bool homePageEnable = true;
//修改這個方法
- (void)applicationDidBecomeActive:(UIApplication*)application
{
    ::printf("-> applicationDidBecomeActive()\n");
    
    if(_snapshotView)
    {
        [_snapshotView removeFromSuperview];
        _snapshotView = nil;
    }
    if (homePageEnable) {
        homePageEnable = false;
        [self performSelector:@selector(startHomePage:) withObject:application afterDelay:0];
    }
    if(_unityAppReady)
    {
        if(UnityIsPaused())
        {
            UnityPause(0);
            UnityWillResume();
        }
        UnitySetPlayerFocus(1);
    }
    else if(!_startUnityScheduled)
    {
        _startUnityScheduled = true;
    }
    
    _didResignActive = false;
}

- (void)startHomePage:(UIApplication *)application {
    AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    [delegate.window makeKeyAndVisible];
}

- (void)startUnityFirstTime {
    [self startUnity:[UIApplication sharedApplication]];
    [[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:[[GameViewController alloc] init] animated:YES completion:nil];
}

- (void)startUnityOtherTime {
    [[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:[[GameViewController alloc] init] animated:YES completion:nil];
    if (_didResignActive) {
        UnityPause(false);
    }
    _didResignActive = false;
}

- (void)doExitSelector {
    UnityPause(true);
    _didResignActive = true;
    Profiler_UninitProfiler();
}

接下來找到剛才創(chuàng)建的GameViewController.h

#import <UIKit/UIKit.h>

@interface GameViewController : UIViewController

@property (strong, nonatomic) UnityAppController *unityController;
@property (strong, nonatomic) UIWindow *unityWindow;

@end

然后在GameViewController.m中,導(dǎo)入#import "UnityAppController.h"

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.view.backgroundColor = [UIColor whiteColor];

    
    [self.view addSubview:UnityGetMainWindow().rootViewController.view];
    [self addChildViewController:UnityGetMainWindow().rootViewController];
    
}

接下來就是調(diào)起Unity、關(guān)閉Unity、相互傳值(交互)
調(diào)起Unity:
調(diào)起是很方便的,因為是從原生跳轉(zhuǎn)過去,比如點擊某個按鈕,那么只需在按鈕的點擊方法中調(diào)用就可以了:

AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
[delegate showUnityWindow];

這樣就會模態(tài)出來Unity的界面
關(guān)閉Unity:
接下來是關(guān)閉Unity,對于返回原生,要在做處理的GameViewController這個方法里進行處理_BackBtnPress這個方法名是需要和unity那邊點擊方法名一致

void _BackBtnPress(){
    
    AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    [delegate hideUnityWindow];
    
}

傳值呢,很簡單,就一句話,Unity那邊做接收就可以了

//第一個參數(shù):消息的接受者,或者說誰來執(zhí)行方法
//第二個參數(shù):函數(shù)名
//第三個參數(shù):需要傳的值
UnitySendMessage("ReceiveiOSMessage", "ReceiveiOSInputMessage", _unityStr);
//注意,三個參數(shù)都是C語言字符串,沒有@哦

OK啦~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)自http://blog.csdn.net/qinqi376990311/article/details/723...
    沃倫蓋茨閱讀 1,610評論 1 0
  • 需要注意的是,Unity一旦初始化,是不能關(guān)閉的,否則App直接就會被關(guān)閉。所以,一旦調(diào)起Unity,內(nèi)存就不會降...
    MichaelLedger閱讀 1,694評論 1 5
  • 最近遇到一個識別圖像后顯示3D模型的需求,權(quán)衡再三選擇了國內(nèi)的easyAR SDK。Unity建模完成后,導(dǎo)出相應(yīng)...
    Lotheve閱讀 3,016評論 11 6
  • iOS中添加unity模塊說明 iOS中添加unity模塊的demo,可以在 看一看->項目 中找到.2.參考網(wǎng)址...
    焉逢12閱讀 4,443評論 3 5
  • - 說明 參考網(wǎng)址unity導(dǎo)出工程導(dǎo)入到iOS原生工程中詳細步驟 我現(xiàn)在有兩個工程,一個是從unity中導(dǎo)出的i...
    Bob_Running閱讀 1,149評論 0 0

友情鏈接更多精彩內(nèi)容