如何將Unity以庫形式集成到原生iOS和Android應用

本文轉自Unity Connect

從Unity 2019.3.a2開始茬暇,我們通過把Unity運行時組件和內(nèi)容集成到原生平臺項目叽讳,在原生應用中將Unity作為庫使用拟蜻。

本文將分享如何將Unity以庫形式集成到原生iOS和Android應用。了解更多信息震捣,請閱讀:《在原生iOS或Android應用中將Unity作為庫使用》荔棉。

請訪問云盤下載示例項目

下載鏈接: https://pan.baidu.com/s/1JFWjbrh2x-qAsCzMwLywLA

提取碼: 9a71

iOS
請iOS開發(fā)者使用Unity 2019.3.a2及更高版本,以及Xcode 9.4及更高版本蒿赢。

下載Unity 2019.3.a2:https://unity3d.com/alpha/2019.3

1润樱、下載和解壓項目

我們會把該Unity項目加入到原生iOS應用,Assets/Plugins/iOS文件夾中的文件用于使Unity播放器和原生應用進行通信羡棵。

我們提供了一個簡單的Xcode單視圖應用壹若,該項目擁有UI,可以使用UnityFrameworkLoad()加載播放器。

為了方便起見店展,我們把二個項目解壓到相同文件夾下养篓。

image

2、生成iOS的Xcode項目

我們按正常操作生成Xcode項目即可赂蕴。

首先在Unity編輯器打開UnityProject項目柳弄,選擇Menu -> Window -> Package Manager,因為2.0.8版本不兼容使用Unity作為庫概说,所以要移除Ads資源包碧注,或更新Ads資源包到v 3.*版本。

選擇Menu -> Edit -> Player Settings -> Player -> iOS設置標簽頁 -> Identification Section席怪,設置有效的Bundle Identification和Signing Team ID应闯,以避免后續(xù)步驟出現(xiàn)Xcode簽名問題。

打開Menu -> File -> Builds Settings挂捻,在此選擇并切換平臺為iOS。將UnityProject項目構建到iosBuild文件夾船万。

image

3刻撒、設置Xcode工作空間

Xcode工作空間允許同時處理多個項目,并結合它們的結果耿导。 我們在Xcode打開NativeiOSApp.xcodeproj声怔。選擇File -> New -> Workspace,創(chuàng)建工作空間舱呻,把它保存在UaaLExample/both.xcworkspace醋火。

image

關閉NativeiOSApp.xcodeproj項目,此后的步驟會在剛創(chuàng)建的工作空間項目完成箱吕。

選擇File -> Add Files to “both”芥驳,把NativeiOSApp.xcodeproj和第2步生成的Unity-iPhone.xcodeproj添加到相同等級的工作空間。

image

4茬高、添加UnityFramework.framework

我們以框架的形式添加Unity播放器到NativeiOSApp兆旬,它目前不會改變NativeiOSApp的行為。

首先從NativeiOSApp項目選擇NativeiOSApp目標怎栽。在General -> Embedded Binaries中按下+按鈕丽猬。選擇Unity-iPhone/Products/UnityFramework.framework。

我們從Linked Frameworks and Libraries移除UnityFramework.framework熏瞄,選中該條目并按下-按鈕即可脚祟。

image

5、公開NativeCallProxy.h

原生應用會實現(xiàn)下面文件定義的NativeCallsProtocol强饮。

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

然后在Target Membership中勾選UnityFramework,通過UnityFramework右側的下拉圖標,把標頭可見性設為Public沥寥。

image

6碍舍、使Data文件夾成為UnityFramework的一部分

默認情況下,Data文件夾是Unity-iPhone目標的一部分邑雅,我們會通過修改它片橡,使所有內(nèi)容封裝到單個框架文件中。

我們把Data文件夾的Target Membership改為UnityFramework淮野。

image

在之前的改動后捧书,為了使Unity-iPhone項目繼續(xù)工作,Unity播放器需要通過從Unity-iPhone/MainApp/main.mm進行調用骤星,指向Data文件夾所處的新位置经瓷。

[ufw setDataBundleId: "com.unity3d.framework"];

在這種情況下不支持按需使用資源。為了使它們正常工作洞难,我們不會使用前面的調用舆吮,因為默認情況下Data文件夾位于mainBundle,所以我們要復制Data文件夾到原生應用队贱,并跳過前面的調用色冀。

image

運行 所有內(nèi)容已經(jīng)準備好針對二個項目進行構建,運行和調試柱嫌,即:Unity-iPhone項目和NativeiOSApp項目锋恬,選擇Scheme為NativeiOSApp或Unity-iPhone。

image

如果一切順利编丘,我們可以運行NativeiOSApp与学。

image

完整項目說明 在集成步驟中遇到問題,你可以嘗試已經(jīng)準備好構建和部署的完整項目嘉抓,只需要修復Xcode的簽名即可索守。

  • NativeiOSApp目標

  • Unity-iPhone目標(可選)

  • UnityFramework目標不需要簽名

請下載并解壓完整項目文件,在Xcode打開both.xcworkspace掌眠,運行NativeiOSApp Scheme蕾盯。

關鍵要點

Unity播放器由UnityFramework對象控制。為了獲取該對象蓝丙,我們要調用UnityFrameworkLoad级遭,它會加載UnityFramework.framework,然后返回單個實例到UnityFramework類渺尘,請觀察Unity-iPhone/UnityFramework/UnityFramework.h挫鸽,了解它的API。

請在NativeiOSApp/NativeiOSApp/MainViewController.mm文件中或Unity-iPhone/MainApp/main.mm文件中觀察UnityFrameworkLoad鸥跟。

 #include <UnityFramework/UnityFramework.h>

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
        [ufw setExecuteHeader: &_mh_execute_header];   

        // 同步Data文件夾的Target Membership設置
        [ufw setDataBundleId: "com.unity3d.framework"]    

    }
    return ufw;
}

Android

請Android開發(fā)者使用Unity 2019.3.a2及更高版本丢郊,以及Android Studio 3.3.2及更高版本盔沫。

1、下載和解壓項目

請下載Unity項目枫匾,該項目是要加入原生Android應用的示例Assets/Plugins/Android文件夾中有擴展UnityPlayerActivity的OverrideUnityActivity文件架诞。

我們提供的原生Android項目是來自Android Studio模板的Basic Activity應用程序,我們會把前面的Unity項目加入到這里干茉。該項目有UI和MainUnityActivity來擴展OverrideUnityActivity谴忧,可以使用Intent啟動MainUnityActivity。

為了方便起見角虫,我們把二個項目解壓到相同文件夾下沾谓。

image

2、生成Android平臺的Gradle項目

我們在Unity編輯器打開UnityProject項目戳鹅,點擊Menu -> File -> Build Settings打開Build Settings均驶。

選擇并切換為Android Platform,勾選Export Project選項枫虏。

image

我們把UnityProject導出到androidBuild文件夾妇穴,該文件夾結構如下圖所示。

image

3模软、把Unity Library模塊添加到NativeAndroidApp

現(xiàn)在把androidBuild/unityLibrary模塊添加給Android Studio 中的NativeAndroidApp Gradle項目:

我們在Android Studio打開NativeAndroidApp伟骨,然后打開settings.gradle文件。在該文件末尾燃异,添加指向unityLibrary的新項目。

 include ':unityLibrary'
project(':unityLibrary').projectDir=new File('..\\UnityProject\\androidBuild\\unityLibrary') 
image

打開build.gradle文件继蜡,把下面代碼添加到dependencies代碼塊回俐。

implementation project(':unityLibrary')

image

打開build.gradle文件,把下面代碼添加到allprojects{repositories{代碼塊稀并。

flatDir {
   dirs "${project(':unityLibrary').projectDir}/libs"
}

image

Gradle文件已經(jīng)修改仅颇,單擊Sync Now。

image

如果一切順利碘举,我們會看到unityLibrary模塊添加到Android視圖中忘瓦。

image

運行 現(xiàn)在已經(jīng)準備好進行構建,運行和調試引颈。

image

如果一切順利耕皮,我們應該可以運行NativeAndroidApp。

image

請注意:在應用程序安裝到設備后蝙场,會出現(xiàn)二個啟動應用程序的圖標凌停,請把<intent-filter>...</intent-filter>從unityLibrary的AndroidManifest.xml去掉,僅保留集成版本售滤。

完整項目說明

如果在集成步驟中遇到問題罚拟,你可以嘗試已經(jīng)準備好構建和部署的完整項目台诗。請下載并解壓完整項目文件,在Android Studio打開NativeAndroidApp赐俗。

小結

如何將Unity以庫形式集成到原生iOS和Android應用為大家介紹到這里拉队,請下載示例項目動手操作起來吧。

原文鏈接:https://connect.unity.com/p/ru-he-jiang-unityyi-ku-xing-shi-ji-cheng-dao-yuan-sheng-ioshe-androidying-yong?app=true
更多Unity干貨資源阻逮,請戳上方鏈接下載Unity官方app粱快。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市夺鲜,隨后出現(xiàn)的幾起案子皆尔,更是在濱河造成了極大的恐慌,老刑警劉巖币励,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件慷蠕,死亡現(xiàn)場離奇詭異,居然都是意外死亡食呻,警方通過查閱死者的電腦和手機流炕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仅胞,“玉大人每辟,你說我怎么就攤上這事「删桑” “怎么了渠欺?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長椎眯。 經(jīng)常有香客問我挠将,道長,這世上最難降的妖魔是什么编整? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任舔稀,我火速辦了婚禮,結果婚禮上掌测,老公的妹妹穿的比我還像新娘内贮。我一直安慰自己,他們只是感情好汞斧,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布夜郁。 她就那樣靜靜地躺著,像睡著了一般断箫。 火紅的嫁衣襯著肌膚如雪拂酣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死雇寇,一個胖子當著我的面吹牛赵颅,可吹牛的內(nèi)容都是我干的虽另。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼饺谬,長吁一口氣:“原來是場噩夢啊……” “哼捂刺!你這毒婦竟也來了?” 一聲冷哼從身側響起募寨,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤族展,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后拔鹰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仪缸,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年列肢,在試婚紗的時候發(fā)現(xiàn)自己被綠了恰画。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡瓷马,死狀恐怖拴还,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情欧聘,我是刑警寧澤片林,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站怀骤,受9級特大地震影響拇厢,放射性物質發(fā)生泄漏。R本人自食惡果不足惜晒喷,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望访敌。 院中可真熱鬧凉敲,春花似錦、人聲如沸寺旺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽阻塑。三九已至蓝撇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間陈莽,已是汗流浹背渤昌。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工虽抄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人独柑。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓迈窟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親忌栅。 傳聞我的和親對象是個殘疾皇子车酣,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

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

  • “你說有人跟蹤你?” “嗯索绪,他已經(jīng)跟蹤我不知多久了湖员,但每次只要我下班他就會出現(xiàn)在我身后,一直跟到我家門口瑞驱∧锼ぃ” “什...
    梁畢歪閱讀 913評論 16 29
  • 教育契機是指在教育過程中事物發(fā)展或一事物轉化為他事物的關鍵、樞紐钱烟,決定性的環(huán)節(jié)晰筛。在從教的這段歷程中,我發(fā)現(xiàn)敏銳捕捉...
    螞蟻Lzh閱讀 840評論 0 1
  • 這一周其實發(fā)生了挺多事情的拴袭。生病读第、等待、回老家……一件件事情拥刻,占據(jù)了你的空閑時間怜瞒。 我們就一條簡單的公式展開談談:...
    龐校長閱讀 152評論 0 0
  • 雪域瓊壁安華夏 牛羊綠草繞哈達 朝來霜花午驕陽 布達拉宮藏人家 信徒合掌虔誠拜 悠悠天路演芳華 最是人間天堂境 嬌...
    雪落重陽閱讀 339評論 2 5