PAYATHON 2026

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 版本或保存场景后的行为信息,目前无法判断是否还存在版本相关问题。

备注:内容仅供参考。