在 Godot 中使用任何 C++ 库
Godot 已成为近年来最受欢迎的游戏引擎之一。它是免费和开源的,遵循 MIT 许可,体积足够小,可以在几分钟内下载并开始使用。大多数 Godot 游戏是用 GDScript 编写的,这是引擎自己的脚本语言。然而,迟早许多项目需要一些已经存在的 C 或 C++ 库:模拟库、数据库、网络协议、机器学习运行时。GDScript 无法调用本地代码,但 Godot 可以通过 GDExtension 加载本地代码,而 godot-cpp,官方的 C++ 绑定,则可以让您将这些代码作为常规引擎类进行暴露。编写 C++ 代码是简单的部分。困难的部分是构建:godot-cpp 必须与您的 Godot 版本匹配,您添加的每个库必须为您要发布的每个平台进行编译。在这篇文章中,我们将简要介绍 Godot,解释 C++ 扩展的工作原理,并展示如何使用 Conan 和如今在 ConanCenter 上可用的 godot-cpp 10 将 C++ 库引入 Godot 游戏。作为一个例子,我们将使用 flecs 这个实体组件系统库,在 Godot 场景中模拟 100,000 个粒子。下载视频:在 Godot 场景中使用 flecs 模拟的 100,000 粒子,逃避鼠标光标。 Godot 简介 Godot 是一个用于 2D 和 3D 游戏的通用引擎。Godot 项目中的一切都是由两个概念构建的:节点是基本构建块。每个节点都有一个类型 (Sprite2D、Camera3D、AudioStreamPlayer、Timer 等),一组您可以在检查器中编辑的属性,以及在游戏循环中引擎会调用的回调,如 _ready() 或 _process()。场景是保存为 .tscn 文件的节点树。一个场景可以是一个角色、一个菜单或一个完整的关卡,场景可以在其他场景中实例化。行为通常通过将脚本附加到节点来添加。GDScript 是一种为引擎设计的类似 Python 的语言,它非常适合游戏逻辑,因为更改会立即显示,而无需编译步骤。对 C++ 开发者来说,Godot 的一个有趣之处在于引擎本身是用 C++ 编写的,它可以在不重新编译的情况下加载用 C++ 编写的扩展。来自这些扩展的类成为常规引擎类:它会在编辑器中显示,与内置节点并排,并且其属性在检查器中可见,GDScript 可以像使用其他节点一样使用它。下一部分将解释这些扩展的工作原理。 使用 C++ 扩展 Godot 添加 C++ 代码有两种方法:引擎模块被编译到引擎本身。它们可以完全访问内部,但您需要构建并发布自己的 Godot 副本,包括编辑器和针对每个平台的导出模板。GDExtension 在运行时将共享库 (.dll、.so、.dylib 或 .wasm) 加载到官方未修改的 Godot 构建中。引擎通过稳定的 C 接口与库进行交互。GDExtension 是大多数项目推荐的方法,许多流行的插件就是通过这种方式分发的。由于直接使用 C 接口的冗长,Godot 团队维护了 godot-cpp,一个 C++ 库,它用接近引擎内部使用的 API 封装了它。它为每个引擎类提供了一个 C++ 类,例如 Node2D、Sprite2D 或 Input。您自己的类是从这些类派生的常规 C++ 代码。用 godot-cpp 编写的节点看起来像这样: #include <godot_cpp/classes/node2d.hpp> namespace godot { class MyNode : public Node2D { GDCLASS ( MyNode , Node2D ) protected: static void _bind_methods () {} public: void _process ( double p_delta ) override { // 每帧运行 } }; } // namespace godot 自 10.0 版本以来,单一的 godot-cpp 版本可与从 4.3 开始的任何 Godot 版本一起使用。您只需选择一个,使用 api_version 构建选项,godot-cpp 将根据该版本的 API 生成 C++ 类。为 Godot 4.3 构建的扩展也适用于较新的版本,但不适用于较旧的版本,因此您通常选择想要支持的最旧 Godot 版本。构建目标和特性标签在构建任何内容之前,您需要知道一个概念。godot-cpp 是针对三种目标之一进行编译的,名称来自于加载库的 Godot 构建:template_debug:默认。通过 DEBUG_ENABLED 定义启用调试检查。此库由编辑器和调试导出加载。template_release:用于发布导出,已删除调试检查。editor:仅由编辑器加载的库。Godot 加载哪个库是在运行时通过一个小的 .gdextension 文件决定的。它将特性标签映射到库路径。debug 标签与编辑器和调试导出匹配,release 标签与发布导出匹配: [configuration] entry_symbol = "gdexample_library_init" compatibility_minimum = "4.7" [libraries] macos.debug = "res://bin/libgdexample.template_debug.dylib" macos.release = "res://bin/libgdexample.template_release.dylib" linux.debug = "res://bin/libgdexample.template_debug.so" linux.release =
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡