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

好長時間沒有寫了,一直忙沒來得及寫只泼,繼續(xù)把上篇已經(jīng)實現(xiàn)了將Unity導出的工程集成到原生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中辛掠,導入#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)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市撤防,隨后出現(xiàn)的幾起案子虽风,更是在濱河造成了極大的恐慌,老刑警劉巖寄月,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辜膝,死亡現(xiàn)場離奇詭異,居然都是意外死亡漾肮,警方通過查閱死者的電腦和手機厂抖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來初橘,“玉大人验游,你說我怎么就攤上這事”i埽” “怎么了耕蝉?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長夜只。 經(jīng)常有香客問我垒在,道長,這世上最難降的妖魔是什么扔亥? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任场躯,我火速辦了婚禮,結(jié)果婚禮上旅挤,老公的妹妹穿的比我還像新娘踢关。我一直安慰自己,他們只是感情好粘茄,可當我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布签舞。 她就那樣靜靜地躺著,像睡著了一般柒瓣。 火紅的嫁衣襯著肌膚如雪儒搭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天芙贫,我揣著相機與錄音搂鲫,去河邊找鬼。 笑死磺平,一個胖子當著我的面吹牛魂仍,可吹牛的內(nèi)容都是我干的拐辽。 我是一名探鬼主播,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼擦酌,長吁一口氣:“原來是場噩夢啊……” “哼薛训!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起仑氛,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎闸英,沒想到半個月后锯岖,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡甫何,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年出吹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辙喂。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡捶牢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出巍耗,到底是詐尸還是另有隱情秋麸,我是刑警寧澤,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布炬太,位于F島的核電站灸蟆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏亲族。R本人自食惡果不足惜炒考,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望霎迫。 院中可真熱鬧斋枢,春花似錦、人聲如沸知给。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽炼鞠。三九已至缘滥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間谒主,已是汗流浹背朝扼。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留霎肯,地道東北人擎颖。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓榛斯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親搂捧。 傳聞我的和親對象是個殘疾皇子驮俗,可洞房花燭夜當晚...
    茶點故事閱讀 45,747評論 2 361

推薦閱讀更多精彩內(nèi)容