Godot C++ GDExtension 如何导出可点击的工具按钮?
数据小陈
结论
PROPERTY_HINT_TOOL_BUTTON 对应一个 Callable 属性。你的 PropertyInfo 把属性名设成了空字符串:
PropertyInfo(Variant::CALLABLE, "", PROPERTY_HINT_TOOL_BUTTON, ...)
这与报错中显示的空 action 名称相符。将属性名设为非空字符串,并让 getter 返回要执行的 Callable,按钮就能调用目标函数。Godot 文档说明,此 hint 会将 Callable 属性显示为可点击按钮;引擎示例也使用了非空的属性路径。Godot PROPERTY_HINT_TOOL_BUTTON 文档 引擎示例
修改属性声明
保留现有的 generateWorld() getter,将属性名改为 generate_world 等非空名称:
void VoxelChunk::_bind_methods() {
ClassDB::bind_method(D_METHOD("generateWorld"), &VoxelChunk::generateWorld);
ADD_PROPERTY(
PropertyInfo(
Variant::CALLABLE,
"generate_world",
PROPERTY_HINT_TOOL_BUTTON,
"Generate Chunk",
PROPERTY_USAGE_EDITOR
),
"",
"generateWorld"
);
}
ADD_PROPERTY 的最后两个参数依次是 setter 和 getter。这里不需要 setter,因此传入空字符串;getter generateWorld 返回按钮点击时要调用的 Callable。Generate Chunk 是按钮上显示的标签,与属性名不同。
现有 getter 可以继续返回绑定到成员函数的 callable:
Callable VoxelChunk::generateWorld() {
return callable_mp(this, &VoxelChunk::_generateWorld);
}
点击按钮后,_generateWorld() 会执行并打印 Generated。
检查项
- 确认
PropertyInfo中的属性名不是空字符串。 - 确认属性类型为
Variant::CALLABLE,hint 为PROPERTY_HINT_TOOL_BUTTON。 - 确认 getter 名称与
ClassDB::bind_method注册的名称一致,并且 getter 返回有效的Callable。 - 如果修改后仍报错,检查按钮指向的 callable 是否有效,以及场景数据是否覆盖了该属性。由于没有提供 Godot 版本或保存场景后的行为信息,目前无法判断是否还存在版本相关问题。
备注:内容仅供参考。
