本文是自己在研究学习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插件库房:github.com/godotengine…

库房的下载能够直接下载对应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工程了,结合开始运用插件的部分,就能够对引擎进行高度的定制化。