Godot3之編譯和使用iOS插件

本文是自己在研究學習Godot時的筆記条舔。

一丹弱、使用插件

1.1 在Godot里使用的情況

一個iOS插件需要一個 .gdip 配置文件, 一個二進制文件, 它可以是 .a 靜態(tài)庫, 也可以是 .xcframework 包含 .a 靜態(tài)庫, 可能還有其他依賴關(guān)系. 要使用它, 需要:

  • 1.將插件的文件復(fù)制到Godot項目的 res://ios/plugins 目錄中. 你也可以將文件分組在一個子目錄中, 比如 res://ios/plugins/my_plugin
  • 2.Godot編輯器自動檢測并導入 res://ios/plugins 及其子目錄中的 .gdip 文件.
  • 3.可以通過進入Project-> Export... ->iOS, 在選項卡中, 滾動到Plugins部分, 找到并激活檢測到的插件.
001.png

在Godot項目里面的iOS插件目錄:

002.png

注意,自己創(chuàng)建的.gdip文件俏让,注意下面的問題:

[config]
name="GodotSkyBridge"  # 插件的名稱
binary="GodotSkyBridge.xcframework"  # 千萬注意別寫錯xcframework的名字

initialization="godot_iosbridge_init"  # 兩個函數(shù)是代碼寫的笔咽,這里不能寫錯
deinitialization="godot_iosbridge_deinit"

[dependencies]  # 如果有依賴的情況
linked=[]
embedded=[]
system=[]
capabilities=[]
files=[]
[plist]  # 隱私key之類的情況,會加到info.plist里面

1.2 在iOS工程里使用的情況

我當前就是這種情況蔫巩,我并不需要將插件放到Godot工程里面谆棱,而是將插件打包成xcframework放在iOS工程里面,在工程運行時圆仔,讓Godot引擎加載插件即可垃瞧。

例如在iOS工程的dummy.cpp文件內(nèi)容如下:

// Godot Plugins
void godot_ios_plugins_initialize();
void godot_ios_plugins_deinitialize();
// Exported Plugins

// Plugin: GodotSkyBridge
extern void my_plugin_init();
extern void my_plugin_deinit();

// Use Plugins
void godot_ios_plugins_initialize() {
    my_plugin_init();
}

void godot_ios_plugins_deinitialize() {
    my_plugin_deinit();
}

dummy.cpp文件為Godot引擎所需的插件入口文件,會在引擎啟動時調(diào)用坪郭。這樣的好處時个从,可以暴漏代碼的.h頭文件,原生能直接和Godot引擎通信,例如工程結(jié)構(gòu):

003.png

二嗦锐、創(chuàng)建iOS插件

2.1 編譯Godot頭文件

下載下面官方的iOS插件倉庫嫌松,以為里面有現(xiàn)成的腳本和例子。(==注意所需分支==)

iOS插件倉庫:https://github.com/godotengine/godot-ios-plugins

倉庫的下載可以直接下載對應(yīng)release代碼奕污,或者使用git命令下載萎羔,例如:

$ git clone --recursive https://github.com/godotengine/godot-ios-plugins.git godot-ios-plugins
004.png

下載好倉庫代碼之后,是沒有紅色框的東西的碳默。

  • a.如果直接下載的倉庫源碼贾陷,godot文件夾會是空的,需要自己再下載Godot的源碼并放到godot文件夾下
  • b.使用上面git命令下載的代碼嘱根,godot文件夾會自動拉取對應(yīng)的Godot源碼
  • c.將extract_headers.shgenerate_headers.sh這2個腳本髓废,從scripts文件夾里面拷貝到外面的根目錄下,如上圖的紅色框该抒。(其實不復(fù)制出來也可以慌洪,這里只是為了突出這些腳本的重要性)
  • d.終端來到這個根目錄下,執(zhí)行腳本:
$ cd xxxx_path # 倉庫目錄
$ ./generate_headers.sh  # 注意下面的說明
$ ./extract_headers.sh

需要注意的是:執(zhí)行./generate_headers.sh之后凑保,會開始編譯Godot的源碼蒋譬,沒必要編譯完畢,執(zhí)行大概十秒就直接停掉就行愉适。執(zhí)行./extract_headers.sh之后犯助,倉庫根目錄就會多一個/bin文件夾,里面接下來所需的Godot頭文件

A.腳本generate_headers.sh內(nèi)容如下:

#!/bin/bash
cd ./godot && \
    ./../scripts/timeout scons platform=iphone target=release_debug

# 從腳本可以看出來维咸,其實是在 scons 構(gòu)建iPhone平臺的目標文件
# 注意

B.腳本extract_headers.sh內(nèi)容如下:

#!/bin/bash

rsync -a -m -R --include '*/' --include '*.h' --include '*.inc' --exclude '*' ./godot ./bin/extracted_headers

2.2 創(chuàng)建和設(shè)置Xcode工程

創(chuàng)建靜態(tài)庫工程剂买,我這里隨便起個名字叫GodotSkyBridge

005.png

設(shè)置iOS的版本:


006.png

設(shè)置架構(gòu):


007.png

將生成好的Godot頭文件拖到項目里,簡單粗暴:


008.png

設(shè)置HEADER_SEARCH_PATHS:

009.png

這里的值癌蓖,簡單的辦法是瞬哼,選中工程里面的Godot目錄,在Xcode左側(cè)屬性里復(fù)制即可:


010.png

此時直接編譯一下租副,會成功坐慰,其實已經(jīng)生成.a文件了,但是可能不知道在哪里用僧。有2個辦法:
2.2.1 在下圖中结胀,直接復(fù)制,粘貼到文本工具里责循,會有.a的路徑:

011.png

2.2.2 第二種辦法是:打開項目的project.pbxproj糟港,搜索productRefGroup,將productRefGroup上面一行的mainGroup的值院仿,復(fù)制給productRefGroup秸抚,再保存一下速和,Xcode就自動刷新出來了。

012.png

開始敲代碼之前剥汤,還需要設(shè)置一下Other C Flags

013.png

增加 -fcxx-modules-fmodules颠放,如果你需要支持調(diào)試就還有 -DDEBUG

2.3 導出靜態(tài)庫方案A

(我不推薦此方案)敲完代碼,選擇Scheme吭敢,分別設(shè)置ReleaseDebug碰凶,進而拿到.a文件:

014.png

我將2個.a復(fù)制到了一個單獨的文件夾,并重命名了:

015.png

執(zhí)行下面的命令省有。將.a文件轉(zhuǎn)為了.xcframework文件:

# debug文件
$ xcodebuild -create-xcframework -library libGodotSkyBridge.arm64_debug.a -output libGodotSkyBridge.debug.xcframework
# release文件
$ xcodebuild -create-xcframework -library libGodotSkyBridge.arm64_release.a -output libGodotSkyBridge.release.xcframework

可以通過lipo -info命令查看.a的架構(gòu)信息:

$ lipo -info libGodotSkyBridge.arm64_release.a 
Non-fat file: libGodotSkyBridge.arm64_release.a is architecture: arm64

??這部分可以參考iOS的靜態(tài)庫的創(chuàng)建和使用

2.4 導出靜態(tài)庫方案B

2.3的方案里面痒留,需要在工程的setting里面設(shè)置很多參數(shù)谴麦,一旦有錯誤蠢沿,就在Godot里面使用不了,下面使用腳本的方案:
從官方的 godot-ios-plugins 項目下載下來匾效,注意分支舷蟀。將寫好的代碼。放到plugins里面面哼,注意建單獨的文件夾:

016.png

修改項目根目錄下面的SConstruct腳本內(nèi)容野宜,讓腳本知道我們增加了一個自己的庫:

017.png

generate_static_library.sh從scripts拷貝到項目的根目錄下。然后在終端執(zhí)行魔策,注意加參數(shù):

$ cd xxx
$ ./generate_static_library.sh GodotSkyBridge release 3.x

# 三個參數(shù) 插件名 編譯類型 Godot版本

我在執(zhí)行腳本之前匈子,在倉庫目錄里面的godot是有內(nèi)容的,也就是godot的頭文件闯袒,可以在2.3里面看看怎么生成頭文件虎敦。

備份generate_static_library.sh腳本內(nèi)容:

#!/bin/bash
set -e

# Compile static libraries

# ARM64 Device
scons target=$2 arch=arm64 plugin=$1 version=$3
# x86_64 Simulator
scons target=$2 arch=x86_64 simulator=yes plugin=$1 version=$3

# Creating a fat libraries for device and simulator
# lib<plugin>.<arch>-<simulator|iphone>.<release|debug|release_debug>.a
lipo -create "./bin/lib$1.x86_64-simulator.$2.a" \
    "./bin/lib$1.arm64-iphone.$2.a" \
    -output "./bin/$1.$2.a"

腳本執(zhí)行完畢,會在倉庫根目錄下政敢,生成bin/文件夾里面其徙,

018.png

.a生成.xcframework,例如只將arm64x86_64合并:

$ cd bin
$ xcodebuild -create-xcframework -library libGodotSkyBridge.arm64-iphone.release_debug.a -library libGodotSkyBridge.x86_64-simulator.release_debug.a -output GodotSkyBridge.debug.xcframework

生成的.xcframework如下圖所示:

019.png

三.將Godot項目結(jié)合原生項目

3.1 Godot導出iOS項目情況

Godot導出的iOS項目結(jié)構(gòu)如下:

020.png

使用Xcode打開之后喷户,如下圖所示唾那,注意觀察紅框里面的內(nèi)容:

021.png

3.2 新建的Xcode工程+Godot工程

兩個步驟:

  • A.新建Xcode工程,設(shè)置版本號褪尝,Pod依賴闹获,并且能正確編譯
  • B.來到新建項目的根目錄下,處理如下:
022.png

其中dylibs是直接從Godot導出的復(fù)制過來的河哑,godot_project是自己新建的昌罩,并將.pck和Godot引擎的xcframework給復(fù)制過來了。
dylibsgodot_project導入到Xcode里面灾馒,注意結(jié)構(gòu)和選擇:

023.png
024.png

正確之后茎用,兩個文件夾的顏色應(yīng)該是藍色的,此時刪除AppDelegateViewControllermain.m三個文件轨功。并把Godot導出的dummy.cpp也導入Xcode里面旭斥。
此時還是無法啟動工程的,去下圖那里古涧,導入庫即可垂券,這些庫都在dylibsgodot_project 2個文件夾里面,其實可以直接拖拽的方式到這里羡滑。

025.png

最后在Info.plist里面增加字段菇爪,告訴Godot引擎,怎么啟動Godot游戲:

026.png

此時可以運行iOS工程了柒昏,結(jié)合最初使用插件的部分凳宙,就可以對引擎進行高度的定制化。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末职祷,一起剝皮案震驚了整個濱河市氏涩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌有梆,老刑警劉巖是尖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異泥耀,居然都是意外死亡饺汹,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門痰催,熙熙樓的掌柜王于貴愁眉苦臉地迎上來兜辞,“玉大人,你說我怎么就攤上這事陨囊∠掖” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵蜘醋,是天一觀的道長胁塞。 經(jīng)常有香客問我,道長压语,這世上最難降的妖魔是什么啸罢? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮胎食,結(jié)果婚禮上扰才,老公的妹妹穿的比我還像新娘。我一直安慰自己厕怜,他們只是感情好衩匣,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布蕾总。 她就那樣靜靜地躺著,像睡著了一般琅捏。 火紅的嫁衣襯著肌膚如雪生百。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天柄延,我揣著相機與錄音蚀浆,去河邊找鬼。 笑死搜吧,一個胖子當著我的面吹牛市俊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播滤奈,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼摆昧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了僵刮?” 一聲冷哼從身側(cè)響起据忘,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤鹦牛,失蹤者是張志新(化名)和其女友劉穎搞糕,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體曼追,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡窍仰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了礼殊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驹吮。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖晶伦,靈堂內(nèi)的尸體忽然破棺而出碟狞,到底是詐尸還是另有隱情,我是刑警寧澤婚陪,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布族沃,位于F島的核電站,受9級特大地震影響泌参,放射性物質(zhì)發(fā)生泄漏脆淹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一沽一、第九天 我趴在偏房一處隱蔽的房頂上張望盖溺。 院中可真熱鬧,春花似錦铣缠、人聲如沸烘嘱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蝇庭。三九已至为狸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間遗契,已是汗流浹背辐棒。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留牍蜂,地道東北人漾根。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像鲫竞,于是被迫代替她去往敵國和親辐怕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

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