iOS 原生項(xiàng)目通過 workspace 來集成 unity 導(dǎo)出的項(xiàng)目

最近公司打算將 unity 項(xiàng)目集成的 iOS 原生項(xiàng)目中坏逢,網(wǎng)上找了很多文章,大都集成復(fù)雜妙黍,關(guān)鍵是還不能成功集成悴侵。
許久,找到了一篇靠譜的文章拭嫁。和小伙伴摸索了好久終于集成成功可免。遂寫此文以供后人日后之用。

1.unity 項(xiàng)目導(dǎo)出iOS 項(xiàng)目

將你自己的 unity 項(xiàng)目或者參考文章中的unity 項(xiàng)目UnityProject按照下面的步驟來導(dǎo)出 iOS 項(xiàng)目做粤。

注意:unity 項(xiàng)目導(dǎo)出 iOS 項(xiàng)目可以有多種方式浇借,這里我們使用的是以 framework 庫(kù)的方式導(dǎo)出的,不清楚的可以詢問 unity 開發(fā)的小伙伴怕品。切記妇垢!我們摸索的時(shí)候就出現(xiàn)過類似坑點(diǎn)!

1.1

首先在Unity編輯器打開UnityProject項(xiàng)目肉康,選擇Menu -> Window -> Package Manager闯估,因?yàn)?.0.8版本不兼容使用Unity作為庫(kù),所以要移除Ads資源包吼和,或更新Ads資源包到v 3.*版本涨薪。

1.2

選擇Menu -> Edit -> Player Settings -> Player -> iOS設(shè)置標(biāo)簽頁(yè) -> Identification Section,設(shè)置有效的Bundle Identification和Signing Team ID炫乓,以避免后續(xù)步驟出現(xiàn)Xcode簽名問題刚夺。

1.3

打開Menu -> File -> Builds Settings,在此選擇并切換平臺(tái)為iOS末捣。將Unity項(xiàng)目導(dǎo)出 iOS 項(xiàng)目到一個(gè)文件夾光督。導(dǎo)出成功后該文件目錄如下:


unity 導(dǎo)出的 iOS 項(xiàng)目文件目錄

2.創(chuàng)建 workspace并添加xcodeproj

workspace允許同時(shí)處理多個(gè)項(xiàng)目,并結(jié)合它們的結(jié)果塔粒。

2.1

我們打開 Xcode结借,選擇File -> New -> Workspace,創(chuàng)建工作空間integration.xcworkspace卒茬,把它保存在integrationProject目錄下船老。并按照下圖設(shè)置integrationProject目錄下的內(nèi)容咖熟,其中NativeiOSAPP為新建的空白的iOS 原生項(xiàng)目,當(dāng)然你也可以用已有的項(xiàng)目柳畔。UnityProject為 unity 導(dǎo)出的 iOS 項(xiàng)目馍管,即 1.3 中導(dǎo)出的那個(gè)文件夾。


1.png
2.2

打開integration.xcworkspace薪韩,選擇File -> Add Files to “integration”确沸,把NativeiOSAPP.xcodeproj和Unity-iPhone.xcodeproj添加到workspace 中。


2.png

3.添加UnityFramework.framework

這一步看似簡(jiǎn)單俘陷,實(shí)則是一個(gè)坑點(diǎn)罗捎。通過圖 3 圖 4直接添加UnityFramework.framework。如果添加后如圖 5一樣拉盾,UnityFramework.framework不是淺白色的就說明添加成功了桨菜。


3.png

4.png

5.png

如果是淺白色的話可以嘗試接下來的添加方法(我就是通過這種方法添加的)
先如下圖找到UnityFramework.framework的位置


6.png

7.png

然后將UnityFramework.framework文件夾拖到NativeiOSAPP的目錄下

8.png

成功后如下圖


9.png

4.設(shè)置NativeCallProxy.h

首先找到并選擇Unity-iPhone / Libraries / Plugins / iOS / NativeCallProxy.h。

然后在Target Membership中勾選UnityFramework捉偏,通過UnityFramework右側(cè)的下拉圖標(biāo)倒得,把標(biāo)頭可見性設(shè)為Public。


10.png

5.設(shè)置Data文件夾

默認(rèn)情況下夭禽,Data文件夾是Unity-iPhone目標(biāo)的一部分霞掺,我們會(huì)通過修改它,使所有內(nèi)容封裝到單個(gè)框架文件中讹躯。

我們把Data文件夾的Target Membership改為UnityFramework根悼。


11.png

改動(dòng)之后Unity-iPhone項(xiàng)目不能正常運(yùn)行,為了使Unity-iPhone項(xiàng)目能夠正常運(yùn)行蜀撑,我們需要在Unity-iPhone/MainApp/main.mm中通過下面代碼指定Data文件夾所處的新位置挤巡。

[ufw setDataBundleId: "com.unity3d.framework"];//com.unity3d.framework是UnityFramework的 bundleID。
12.png

至此酷麦,配置完畢矿卑!UnityFramework 也已經(jīng)集成到 iOS 原生項(xiàng)目中了。此時(shí)iOS 原生項(xiàng)目和 unity 導(dǎo)出的 iOS 項(xiàng)目應(yīng)該都能正常運(yùn)行了沃饶。

6.原生 iOS 項(xiàng)目中調(diào)用 unity

這里我們把 main.m改為 main.mm母廷,然后在Main.storyboard中 ViewController 上添加一個(gè)按鈕,點(diǎn)擊跳轉(zhuǎn)到 unity 工程糊肤。話不多說琴昆,直接上代碼。

main.mm

#import <UIKit/UIKit.h>
#import "AppDelegate.h"

int main(int argc, char * argv[]) {
    char ** aa = argv;
    [[NSUserDefaults standardUserDefaults] setValue:@(argc) forKey:@"argc"];
    [[NSUserDefaults standardUserDefaults] setValue:[NSString stringWithFormat:@"%p",aa] forKey:@"argv"];
    NSString * appDelegateClassName;
    @autoreleasepool {
        // Setup code that might create autoreleased objects goes here.
        appDelegateClassName = NSStringFromClass([AppDelegate class]);
    }
    return UIApplicationMain(argc, argv, nil, appDelegateClassName);
}

AppDelegate.h

#import <UIKit/UIKit.h>
#include <UnityFramework/UnityFramework.h>
#include <UnityFramework/NativeCallProxy.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate,UnityFrameworkListener, NativeCallsProtocol>

@property (nonatomic, strong) UIWindow * window;
@property (nonatomic, strong) UnityFramework *ufw;
@end

AppDelegate.h

#import "AppDelegate.h"

@interface AppDelegate ()

@end

UnityFramework* UnityFrameworkLoad()
{
    NSString* bundlePath = nil;
    bundlePath = [[NSBundle mainBundle] bundlePath];
    bundlePath = [bundlePath stringByAppendingString: @"/Frameworks/UnityFramework.framework"];
    
    NSBundle* bundle = [NSBundle bundleWithPath: bundlePath];
    if ([bundle isLoaded] == false) [bundle load];
    
    UnityFramework* ufw = [bundle.principalClass getInstance];
    if (![ufw appController])
    {
        // unity is not initialized
        [ufw setExecuteHeader: &_mh_execute_header];
    }
    return ufw;
}

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    [[NSUserDefaults standardUserDefaults] setValue:launchOptions forKey:@"launchOptions"];
    self.ufw = UnityFrameworkLoad();
    [self.ufw setDataBundleId:"com.unity3d.framework"];
    [self.ufw registerFrameworkListener:self];
    [NSClassFromString(@"FrameworkLibAPI") registerAPIforNativeCalls:self];

    return YES;
}

- (void)applicationWillResignActive:(UIApplication *)application {
    [[[self ufw] appController] applicationWillResignActive: application];
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
    [[[self ufw] appController] applicationDidEnterBackground: application];
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
    [[[self ufw] appController] applicationWillEnterForeground: application];
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
    [[[self ufw] appController] applicationDidBecomeActive: application];
}
- (void)applicationWillTerminate:(UIApplication *)application {
    [[[self ufw] appController] applicationWillTerminate: application];
}
- (void)showHostMainWindow:(NSString *)color
{}
@end

ViewController.m

#import "ViewController.h"
#include <UnityFramework/UnityFramework.h>
#import "AppDelegate.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}
- (IBAction)pushToUnity:(id)sender {
    NSString *argv = [[NSUserDefaults standardUserDefaults] valueForKey:@"argv"];
    char ** aa;
    sscanf([argv cStringUsingEncoding:NSUTF8StringEncoding], "%p",&aa);
    int bb = [[[NSUserDefaults standardUserDefaults] valueForKey:@"argc"] intValue];
    AppDelegate *dd = (AppDelegate *)([UIApplication sharedApplication].delegate);
    [dd.ufw runEmbeddedWithArgc:bb argv:aa appLaunchOpts:[[NSUserDefaults standardUserDefaults] valueForKey:@"launchOptions"]];
}
@end

這樣集成就完成了馆揉!運(yùn)行iOS 原生項(xiàng)目就可以跳轉(zhuǎn)至 unity 了业舍。至于iOS 和 unity 之間的通信還在摸索之中。期待我神功大成吧。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末舷暮,一起剝皮案震驚了整個(gè)濱河市态罪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌下面,老刑警劉巖复颈,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異沥割,居然都是意外死亡耗啦,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門机杜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來帜讲,“玉大人,你說我怎么就攤上這事叉庐。” “怎么了会喝?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵陡叠,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我肢执,道長(zhǎng)枉阵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任预茄,我火速辦了婚禮兴溜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘耻陕。我一直安慰自己拙徽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布诗宣。 她就那樣靜靜地躺著膘怕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪召庞。 梳的紋絲不亂的頭發(fā)上岛心,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音篮灼,去河邊找鬼忘古。 笑死,一個(gè)胖子當(dāng)著我的面吹牛诅诱,可吹牛的內(nèi)容都是我干的髓堪。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼旦袋!你這毒婦竟也來了骤菠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤疤孕,失蹤者是張志新(化名)和其女友劉穎商乎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體祭阀,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鹉戚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了专控。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抹凳。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖伦腐,靈堂內(nèi)的尸體忽然破棺而出赢底,到底是詐尸還是另有隱情,我是刑警寧澤柏蘑,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布幸冻,位于F島的核電站,受9級(jí)特大地震影響咳焚,放射性物質(zhì)發(fā)生泄漏洽损。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一革半、第九天 我趴在偏房一處隱蔽的房頂上張望碑定。 院中可真熱鬧,春花似錦又官、人聲如沸延刘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)访娶。三九已至,卻和暖如春觉阅,著一層夾襖步出監(jiān)牢的瞬間崖疤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工典勇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留劫哼,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓割笙,卻偏偏與公主長(zhǎng)得像权烧,于是被迫代替她去往敵國(guó)和親眯亦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345