当前位置: 首页> 房产> 建筑 > 在Godot 4.2中使用GDExtension方式制作C++插件

在Godot 4.2中使用GDExtension方式制作C++插件

时间:2025/9/13 22:21:24来源:https://blog.csdn.net/hengxinxuan/article/details/139221196 浏览次数:0次

       这几天在B站和U管看了好多视频,结果还是看的还是云里雾里,视频解说找到很多,但是都是缺少一步步操作提示,今晚总算看官方文档,一步步搞成功了。现在记录一下自己的操作步骤,一是给自己做个记录,二是碰到同样问题的童鞋们,可以做个参考。

具体操作步骤如下:

提前安装好软件:git、python、SCons 

1、在电脑硬盘随便哪个地方建立一个项目,创建项目名称如“gdextension_cpp_example”;

2、从官方github下载 godot-cpp ,当前编辑器和代码的版本都市4.2.2,目前是最新版,这里要求版本一致。用ZIP方式下载的文件名字会是godot-cpp-godot-4.2.2-stable,解压后把文件夹名字改成godot-cpp,并把这个文件复制到我们创建项目的根目录下;

3、按照官方说还要进入这个文件夹下做更新下载子模块处理,我照做了,但是没有发现有什么实际的更新操作。用终端git命令更新方法如下

cd godot-cpp git submodule update --init

4、在根目录下创建godot项目文件夹“demo”,用来godot编辑器的项目根目录用

创建 src文件夹,等下放C++的源文件用。

现在整个项目结果如下

gdextension_cpp_example/
|
+--demo/                  # game example/demo to test the extension
|
+--godot-cpp/             # C++ bindings
|
+--src/                   # source code of the extension we are building

4、用SCons 测试编译库文件。

若要生成和编译绑定,请使用以下命令(替换 <platform>​ 为 windows​ 或 linux​ macos​ 取决于您的操作系统):我是在WINDOWS下开发,所以就执行了一下命令测试。

>cd godot-cpp
>scons -j10 platform=windows

我的电脑配置比较差,是i5 4核,所以只开了j10方式编译,不过速度也不慢,首次几分钟就编译好。

当编译好后,在gdextension_cpp_example\godot-cpp\bin路径下会生成1个库文件

libgodot-cpp.windows.template_debug.x86_64.lib

到看到这些,就说明编译没问题。

5、在项目根目录的src文件中我们开始编写插件文件。我是用VS CODE写,避免VS studio给我生成太多无用的文件。注意:编写插件的时候那些语法爆红都可以不用管,除非自己语法错误要修改。

1、gdexample.h

#ifndef GDEXAMPLE_H
#define GDEXAMPLE_H#include <godot_cpp/classes/sprite2d.hpp>namespace godot {class GDExample : public Sprite2D {GDCLASS(GDExample, Sprite2D)private:double time_passed;protected:static void _bind_methods();public:GDExample();~GDExample();void _process(double delta) override;
};}#endif

2、gdexample.cpp

#include "gdexample.h"
#include <godot_cpp/core/class_db.hpp>using namespace godot;void GDExample::_bind_methods() {
}GDExample::GDExample() {// Initialize any variables here.time_passed = 0.0;
}GDExample::~GDExample() {// Add your cleanup here.
}void GDExample::_process(double delta) {time_passed += delta;Vector2 new_position = Vector2(10.0 + (10.0 * sin(time_passed * 2.0)), 10.0 + (10.0 * cos(time_passed * 1.5)));set_position(new_position);
}
3、register_types.cpp
#include "register_types.h"#include "gdexample.h"#include <gdextension_interface.h>
#include <godot_cpp/core/defs.hpp>
#include <godot_cpp/godot.hpp>using namespace godot;void initialize_example_module(ModuleInitializationLevel p_level) {if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {return;}ClassDB::register_class<GDExample>();
}void uninitialize_example_module(ModuleInitializationLevel p_level) {if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {return;}
}extern "C" {
// Initialization.
GDExtensionBool GDE_EXPORT example_library_init(GDExtensionInterfaceGetProcAddress p_get_proc_address, const GDExtensionClassLibraryPtr p_library, GDExtensionInitialization *r_initialization) {godot::GDExtensionBinding::InitObject init_obj(p_get_proc_address, p_library, r_initialization);init_obj.register_initializer(initialize_example_module);init_obj.register_terminator(uninitialize_example_module);init_obj.set_minimum_library_initialization_level(MODULE_INITIALIZATION_LEVEL_SCENE);return init_obj.init();
}
}

4、register_types.h

#ifndef GDEXAMPLE_REGISTER_TYPES_H
#define GDEXAMPLE_REGISTER_TYPES_H#include <godot_cpp/core/class_db.hpp>using namespace godot;void initialize_example_module(ModuleInitializationLevel p_level);
void uninitialize_example_module(ModuleInitializationLevel p_level);#endif // GDEXAMPLE_REGISTER_TYPES_H

5、手工编写 SCons 用于构建的 SConstruct 文件并不容易。出于这个示例的目的,只需使用我们已经准备好的这个硬编码的 SConstruct 文件。去官方下载这个文件,把他放在项目根目录下,与demo同一级的目录。

6、插件文件准备好了,我们再次编译插件,看看能否正常编译,这次编译命令退到根目录下打。

scons platform=windows

你现在应该能够在 demo / bin / <platform> 中找到该模块.

7、我们需要再创建一个文件,这个文件让Godot知道动态库应该是什么 为每个平台加载和模块的入口功能。文件的放置路径是 gdextension_cpp_example\demo\bin\

gdexample.gdextension

[configuration]entry_symbol = "example_library_init"
compatibility_minimum = "4.2"[libraries]macos.debug = "res://bin/libgdexample.macos.template_debug.framework"
macos.release = "res://bin/libgdexample.macos.template_release.framework"
windows.debug.x86_32 = "res://bin/libgdexample.windows.template_debug.x86_32.dll"
windows.release.x86_32 = "res://bin/libgdexample.windows.template_release.x86_32.dll"
windows.debug.x86_64 = "res://bin/libgdexample.windows.template_debug.x86_64.dll"
windows.release.x86_64 = "res://bin/libgdexample.windows.template_release.x86_64.dll"
linux.debug.x86_64 = "res://bin/libgdexample.linux.template_debug.x86_64.so"
linux.release.x86_64 = "res://bin/libgdexample.linux.template_release.x86_64.so"
linux.debug.arm64 = "res://bin/libgdexample.linux.template_debug.arm64.so"
linux.release.arm64 = "res://bin/libgdexample.linux.template_release.arm64.so"
linux.debug.rv64 = "res://bin/libgdexample.linux.template_debug.rv64.so"
linux.release.rv64 = "res://bin/libgdexample.linux.template_release.rv64.so"
android.debug.x86_64 = "res://bin/libgdexample.android.template_debug.x86_64.so"
android.release.x86_64 = "res://bin/libgdexample.android.template_release.x86_64.so"
android.debug.arm64 = "res://bin/libgdexample.android.template_debug.arm64.so"
android.release.arm64 = "res://bin/libgdexample.android.template_release.arm64.so"

8、其实插件到这里已经是完成了,接下来我们打开godot,就会发现我们写的C++类,搜索节点类GDExample,就能找到我们写的插件了。

官方文档中继续扩展这个插件的一些功能,我就不写,可以去官方查看方法。

关键字:在Godot 4.2中使用GDExtension方式制作C++插件

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: