Godot3之编译和使用iOS插件

本文是自己在研究学习Godot时的笔记。

一、使用插件

1.1 在Godot里使用的情况

一个iOS插件需要一个 .gdip 配置文件, 一个二进制文件, 它可以是 .a 静态库, 也可以是 .xcframework 包含 .a 静态库, 可能还有其他依赖关系. 要使用它, 需要:

  • 1.将插件的文件复制到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

注意,自己创建的.gdip文件,注意下面的问题:

[config]
name="GodotSkyBridge"  # 插件的名称
binary="GodotSkyBridge.xcframework"  # 千万注意别写错xcframework的名字

initialization="godot_iosbridge_init"  # 两个函数是代码写的,这里不能写错
deinitialization="godot_iosbridge_deinit"

[dependencies]  # 如果有依赖的情况
linked=[]
embedded=[]
system=[]
capabilities=[]
files=[]
[plist]  # 隐私key之类的情况,会加到info.plist里面

1.2 在iOS工程里使用的情况

我当前就是这种情况,我并不需要将插件放到Godot工程里面,而是将插件打包成xcframework放在iOS工程里面,在工程运行时,让Godot引擎加载插件即可。

例如在iOS工程的dummy.cpp文件内容如下:

// 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引擎所需的插件入口文件,会在引擎启动时调用。这样的好处时,可以暴漏代码的.h头文件,原生能直接和Godot引擎通信,例如工程结构:

003.png

二、创建iOS插件

2.1 编译Godot头文件

下载下面官方的iOS插件仓库,以为里面有现成的脚本和例子。(==注意所需分支==)

iOS插件仓库:https://github.com/godotengine/godot-ios-plugins

仓库的下载可以直接下载对应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文件夹会自动拉取对应的Godot源码
  • c.将extract_headers.shgenerate_headers.sh这2个脚本,从scripts文件夹里面拷贝到外面的根目录下,如上图的红色框。(其实不复制出来也可以,这里只是为了突出这些脚本的重要性)
  • d.终端来到这个根目录下,执行脚本:
$ cd xxxx_path # 仓库目录
$ ./generate_headers.sh  # 注意下面的说明
$ ./extract_headers.sh

需要注意的是:执行./generate_headers.sh之后,会开始编译Godot的源码,没必要编译完毕,执行大概十秒就直接停掉就行。执行./extract_headers.sh之后,仓库根目录就会多一个/bin文件夹,里面接下来所需的Godot头文件

A.脚本generate_headers.sh内容如下:

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

# 从脚本可以看出来,其实是在 scons 构建iPhone平台的目标文件
# 注意

B.脚本extract_headers.sh内容如下:

#!/bin/bash

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

2.2 创建和设置Xcode工程

创建静态库工程,我这里随便起个名字叫GodotSkyBridge

005.png

设置iOS的版本:


006.png

设置架构:


007.png

将生成好的Godot头文件拖到项目里,简单粗暴:


008.png

设置HEADER_SEARCH_PATHS:

009.png

这里的值,简单的办法是,选中工程里面的Godot目录,在Xcode左侧属性里复制即可:


010.png

此时直接编译一下,会成功,其实已经生成.a文件了,但是可能不知道在哪里。有2个办法:
2.2.1 在下图中,直接复制,粘贴到文本工具里,会有.a的路径:

011.png

2.2.2 第二种办法是:打开项目的project.pbxproj,搜索productRefGroup,将productRefGroup上面一行的mainGroup的值,复制给productRefGroup,再保存一下,Xcode就自动刷新出来了。

012.png

开始敲代码之前,还需要设置一下Other C Flags

013.png

增加 -fcxx-modules-fmodules,如果你需要支持调试就还有 -DDEBUG

2.3 导出静态库方案A

(我不推荐此方案)敲完代码,选择Scheme,分别设置ReleaseDebug,进而拿到.a文件:

014.png

我将2个.a复制到了一个单独的文件夹,并重命名了:

015.png

执行下面的命令。将.a文件转为了.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的架构信息:

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

😄这部分可以参考iOS的静态库的创建和使用

2.4 导出静态库方案B

2.3的方案里面,需要在工程的setting里面设置很多参数,一旦有错误,就在Godot里面使用不了,下面使用脚本的方案:
从官方的 godot-ios-plugins 项目下载下来,注意分支。将写好的代码。放到plugins里面,注意建单独的文件夹:

016.png

修改项目根目录下面的SConstruct脚本内容,让脚本知道我们增加了一个自己的库:

017.png

generate_static_library.sh从scripts拷贝到项目的根目录下。然后在终端执行,注意加参数:

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

# 三个参数 插件名 编译类型 Godot版本

我在执行脚本之前,在仓库目录里面的godot是有内容的,也就是godot的头文件,可以在2.3里面看看怎么生成头文件。

备份generate_static_library.sh脚本内容:

#!/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"

脚本执行完毕,会在仓库根目录下,生成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项目结合原生项目

3.1 Godot导出iOS项目情况

Godot导出的iOS项目结构如下:

020.png

使用Xcode打开之后,如下图所示,注意观察红框里面的内容:

021.png

3.2 新建的Xcode工程+Godot工程

两个步骤:

  • A.新建Xcode工程,设置版本号,Pod依赖,并且能正确编译
  • B.来到新建项目的根目录下,处理如下:
022.png

其中dylibs是直接从Godot导出的复制过来的,godot_project是自己新建的,并将.pck和Godot引擎的xcframework给复制过来了。
dylibsgodot_project导入到Xcode里面,注意结构和选择:

023.png
024.png

正确之后,两个文件夹的颜色应该是蓝色的,此时删除AppDelegateViewControllermain.m三个文件。并把Godot导出的dummy.cpp也导入Xcode里面。
此时还是无法启动工程的,去下图那里,导入库即可,这些库都在dylibsgodot_project 2个文件夹里面,其实可以直接拖拽的方式到这里。

025.png

最后在Info.plist里面增加字段,告诉Godot引擎,怎么启动Godot游戏:

026.png

此时可以运行iOS工程了,结合最初使用插件的部分,就可以对引擎进行高度的定制化。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容