本文是自己在研究學習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
部分, 找到并激活檢測到的插件.
在Godot項目里面的iOS插件目錄:
注意,自己創(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):
二嗦锐、創(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
下載好倉庫代碼之后,是沒有紅色框的東西的碳默。
- a.如果直接下載的倉庫源碼贾陷,
godot
文件夾會是空的,需要自己再下載Godot的源碼并放到godot文件夾下 - b.使用上面
git
命令下載的代碼嘱根,godot文件夾會自動拉取對應(yīng)的Godot源碼 - c.將
extract_headers.sh
和generate_headers.s
h這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
:
設(shè)置iOS的版本:
設(shè)置架構(gòu):
將生成好的Godot頭文件拖到項目里,簡單粗暴:
設(shè)置HEADER_SEARCH_PATHS
:
這里的值癌蓖,簡單的辦法是瞬哼,選中工程里面的Godot目錄,在Xcode左側(cè)屬性里復(fù)制即可:
此時直接編譯一下租副,會成功坐慰,其實已經(jīng)生成.a
文件了,但是可能不知道在哪里用僧。有2個辦法:
2.2.1 在下圖中结胀,直接復(fù)制,粘貼到文本工具里责循,會有.a
的路徑:
2.2.2 第二種辦法是:打開項目的project.pbxproj
糟港,搜索productRefGroup
,將productRefGroup
上面一行的mainGroup
的值院仿,復(fù)制給productRefGroup
秸抚,再保存一下速和,Xcode
就自動刷新出來了。
開始敲代碼之前剥汤,還需要設(shè)置一下Other C Flags
:
增加 -fcxx-modules
和 -fmodules
颠放,如果你需要支持調(diào)試就還有 -DDEBUG
2.3 導出靜態(tài)庫方案A
(我不推薦此方案)敲完代碼,選擇Scheme
吭敢,分別設(shè)置Release
和Debug
碰凶,進而拿到.a
文件:
我將2個.a
復(fù)制到了一個單獨的文件夾,并重命名了:
執(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里面面哼,注意建單獨的文件夾:
修改項目根目錄下面的SConstruct
腳本內(nèi)容野宜,讓腳本知道我們增加了一個自己的庫:
將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/
文件夾里面其徙,
將.a
生成.xcframework
,例如只將arm64
和x86_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
如下圖所示:
三.將Godot項目結(jié)合原生項目
3.1 Godot導出iOS項目情況
Godot導出的iOS項目結(jié)構(gòu)如下:
使用Xcode打開之后喷户,如下圖所示唾那,注意觀察紅框里面的內(nèi)容:
3.2 新建的Xcode工程+Godot工程
兩個步驟:
- A.新建
Xcode
工程,設(shè)置版本號褪尝,Pod
依賴闹获,并且能正確編譯 - B.來到新建項目的根目錄下,處理如下:
其中dylibs
是直接從Godot導出的復(fù)制過來的河哑,godot_project
是自己新建的昌罩,并將.pck
和Godot引擎的xcframework
給復(fù)制過來了。
將dylibs
和godot_project
導入到Xcode里面灾馒,注意結(jié)構(gòu)和選擇:
正確之后茎用,兩個文件夾的顏色應(yīng)該是藍色的,此時刪除AppDelegate
、ViewController
和main.m
三個文件轨功。并把Godot導出的dummy.cpp
也導入Xcode里面旭斥。
此時還是無法啟動工程的,去下圖那里古涧,導入庫即可垂券,這些庫都在dylibs
和godot_project
2個文件夾里面,其實可以直接拖拽的方式到這里羡滑。
最后在Info.plist
里面增加字段菇爪,告訴Godot引擎,怎么啟動Godot游戲:
此時可以運行iOS工程了柒昏,結(jié)合最初使用插件的部分凳宙,就可以對引擎進行高度的定制化。