返回

Godot 4.3 iOS自定义模块构建与导出指南

IOS

Godot 4.3 自定义 iOS 模块构建指南

最近刚接触 Godot (版本 4.3),想整个自定义模块,把 iOS 上一些 Godot 原生搞不定的功能给接进来。一开始照着官方的 Summator 教程撸了个基础模块,确保能编译、能用。

目前,我已经:

  • scons platform=macos target=editor 命令把引擎编译出来了。
  • 在 GDScript 里头能调到这个 Summator 模块。

现在想把这个模块弄到 iOS 的导出包里。 (我知道 Summator 跟 iOS 没半毛钱关系,我就是先跑通流程,再写 iOS 的代码。) 我接着干了这些事:

  1. 用这俩命令编译了 iOS 模板:
    • scons platform=ios target=template_debug arch=arm64
    • scons platform=ios target=template_release arch=arm64
  • 然后在 bin/ 目录生成了这俩文件:
    • libgodot.ios.template_debug.arm64.a
    • libgodot.ios.template_release.arm64.a
  1. 我试着把 iOS 导出模板里的 libgodot.a 文件换成上面生成的,结果导出失败。

懵了,问几个问题:

  • 到底咋把自定义模块塞到 iOS 导出模板里?
  • 生成 .a 文件之后,我还得干点啥?
  • 有啥其他步骤能保证 iOS 构建能认出我的自定义模块吗?

各位大佬给点儿指点吧,感激不尽!

问题根源

导致自定义模块无法在 iOS 导出中正常工作的根本原因在于:iOS 导出模板需要一个包含所有必要模块(包括你的自定义模块)的完整静态库 。直接替换 libgodot.a 行不通,因为那个 .a 文件只包含了标准 Godot 模块。 导出时,Godot 会链接这个预编译的库,如果你直接替换,就会缺少你自定义模块的代码。

解决方案

1. 创建自定义导出模板

最靠谱的办法是创建你自己的自定义导出模板。步骤如下:

  1. 构建包含自定义模块的引擎(iOS 版) :

    先确保你的自定义模块代码位于 Godot 源代码的 modules/ 目录下(比如 modules/my_custom_module)。

    然后,用 SCons 构建针对 iOS 平台的引擎,带上你的模块:

    scons platform=ios target=template_debug arch=arm64 custom_modules="../modules"
    scons platform=ios target=template_release arch=arm64 custom_modules="../modules"
    
    • custom_modules 参数指定了你的自定义模块的路径 (相对于godot根目录) 。可以指定多个,以逗号分隔(不留空格)。比如: custom_modules="../modules/module1,../modules/module2"
    • 你可以根据需要编译不同架构的版本(arm64, x86_64 等)。

    编译成功后,bin/ 目录里会生成 libgodot.ios.template_debug.arm64.alibgodot.ios.template_release.arm64.a。 这俩就是包含了你自定义模块的静态库。

  2. 替换导出模板中的库文件 :

    找到 Godot 编辑器安装目录下的 iOS 导出模板。 通常路径类似于:

    [Godot 安装路径]/editor_data/templates/[Godot 版本]/ios/
    

    这个 ios 文件夹里,你会看到 libgodot.a。备份它! 然后把你刚编译出来的 libgodot.ios.template_debug.arm64.alibgodot.ios.template_release.arm64.a 复制过来,并把它们重命名成 libgodot.a (放到相应的debug/release 子文件夹中)。

    现在, 使用Godot编辑器的"项目"->"导出...", 选中"iOS"导出, 在选项卡最下边的"Custom Template", Debug和Release处, 设置为自定义库的路径,即可. 也可以什么都不做,它会默认找模板目录里的 libgodot.a

2. 使用 Xcode 项目进行更细粒度的控制(进阶)

如果上述方法不奏效,或者你需要对 iOS 项目进行更精细的控制(比如添加 Framework、修改 Build Setting 等),可以考虑修改 Godot 生成的 Xcode 项目。

  1. 正常导出 iOS 项目 :

    用 Godot 编辑器正常导出 iOS 项目。别忘了在导出选项里启用你的自定义模块。

  2. 修改 Xcode 项目 :

    打开导出的 Xcode 项目(.xcodeproj 文件)。

    • 确认链接 : 检查 Build Phases -> Link Binary With Libraries 里是否已经链接了你的自定义模块。通常情况下,如果模块在 Godot 里启用了,这里会自动链接。 如果没有,手动添加。

    • 头文件搜索路径 : 确保 Build Settings -> Header Search Paths 里包含了你的自定义模块的头文件路径。

    • 其他库和 Framework : 如果你的自定义模块依赖其他的 iOS 库或 Framework,在这里添加它们。

    • 代码签名 : 确认代码签名设置正确。

  3. 编译和运行 :

    在 Xcode 里编译和运行你的项目。

    这种方式的优势在于,你可以完全控制 iOS 项目的方方面面,灵活解决各种兼容性问题。 缺点就是,每次从 Godot 重新导出,你都得重新配置 Xcode 项目。

3. 自动化构建脚本(更高级)

如果你经常需要构建包含自定义模块的 iOS 导出包,写个脚本自动化整个流程会省不少事。

以下是一个 Bash 脚本示例:

#!/bin/bash

# Godot 源代码路径
GODOT_SOURCE="/path/to/your/godot/source"
# 自定义模块路径
CUSTOM_MODULES_PATH="../modules"
# 导出模板路径
EXPORT_TEMPLATE_PATH="/path/to/your/godot/editor_data/templates/[Godot 版本]/ios"

# 清理旧的构建
rm -rf "$GODOT_SOURCE/bin/"

# 构建 iOS 引擎(debug 和 release)
cd "$GODOT_SOURCE"
scons platform=ios target=template_debug arch=arm64 custom_modules="$CUSTOM_MODULES_PATH"
scons platform=ios target=template_release arch=arm64 custom_modules="$CUSTOM_MODULES_PATH"

# 替换导出模板库
cp "$GODOT_SOURCE/bin/libgodot.ios.template_debug.arm64.a" "$EXPORT_TEMPLATE_PATH/libgodot_debug.a"
cp "$GODOT_SOURCE/bin/libgodot.ios.template_release.arm64.a" "$EXPORT_TEMPLATE_PATH/libgodot_release.a"

echo "iOS build and template update complete!"

把路径改成你自己的,保存成 .sh 文件(比如 build_ios.sh),然后用 chmod +x build_ios.sh 赋予执行权限。 以后每次要构建,运行 ./build_ios.sh 就完事了。

安全建议

  • 代码审查 : 对自定义模块的代码进行仔细审查,确保没有安全漏洞。
  • 最小权限原则 : 只授予自定义模块完成任务所需的最小权限。
  • 依赖管理 : 清楚了解你的自定义模块依赖哪些库,定期检查更新,避免使用过时的、有漏洞的库。
  • 输入验证 : 在自定义模块接收输入的地方加入完善的输入验证,防范注入类风险。

其他注意事项

  • 确保你的模块中的iOS版本号与你的Godot设置一致。
  • 如果是Objective-C++, 记得要用.mm后缀。
  • 尽量通过抽象来减少模块对于Godot的直接依赖,便于未来的升级与维护。

希望这些对解决你的问题有所帮助。