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

       这几天在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,就能找到我们写的插件了。

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

  • 24
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值