注意:
这篇文章是基于我之前一篇文章所写,两者方式差不多但有细微差别,请先阅读:Godot引擎Gdnative配置VisualStudio的方法 (c++)_SCLchuck的博客-优快云博客
更新:
4.1版本配置梳理以及配置工具:
Godot4.1 GDExtension 配置VisualStudio方法梳理-优快云博客
差别:
项目配置:
1:
在使用scons命令生成godot-cpp的lib库时,需要注意
scons platform=<platform> generate_bindings=yes -j<x> bits=<nn> target=<mm>
注意target中的mm,从原先的debug与release已经变成了editor,template_debug,template_release,可以自己吧项目的debug配置等名字改为对应的。
2:
现在的包含目录发生了改变:
3:
不管你用的什么配置,请选择运行库为/MD,否则会出现:
检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2””。
使用:
1:
源文件头文件名字统一改为 register_type
用于注册的CPP代码已经改为:
#include "register_types.h"
#include <gdextension_interface.h>
#include <godot_cpp/core/defs.hpp>
#include <godot_cpp/core/class_db.hpp>
#include <godot_cpp/godot.hpp>
#include "gdexample.h"
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(const GDExtensionInterface *p_interface, const GDExtensionClassLibraryPtr p_library, GDExtensionInitialization *r_initialization) {
godot::GDExtensionBinding::InitObject init_obj(p_interface, 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();
}
}
并且需要加入头文件:
#ifndef GDEXAMPLE_REGISTER_TYPES_H
#define GDEXAMPLE_REGISTER_TYPES_H
void initialize_example_module();
void uninitialize_example_module();
#endif // GDEXAMPLE_REGISTER_TYPES_H
2:
使用时需要手动创建后缀名为gdextension的文件,内容为:
最终可以在节点目录找到:
其他:
上图中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(float 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);
}
.h:
#ifndef GDEXAMPLE_H
#define GDEXAMPLE_H
#include <godot_cpp/classes/sprite2d.hpp>
namespace godot {
class GDExample : public Sprite2D {
GDCLASS(GDExample, Sprite2D)
private:
float time_passed;
protected:
static void _bind_methods();
public:
GDExample();
~GDExample();
void _process(float delta);
};
}
#endif