如何获取当前获得焦点的控制节点?

Kyl*_*ard 9 gdscript godot

我试图确定哪个控制节点刚刚改变了焦点。通过将节点上的焦点模式更改为 ,已设置另一个控制节点以使用焦点All。从该节点的脚本中,我可以通过检查来判断它是否具有焦点has_focus。但是,我想从另一个脚本中判断它是否改变了焦点。

我知道有focused_entered一些focus_exited信号可以监听,但是这些组件在组件树上彼此相距很远,我不想通过一堆不相关的组件连接或冒泡信号。

控制文档说

只有一个Control节点可以成为键盘焦点。

由于只有一个节点处于焦点,是否有一个全局函数可以确定单个节点当前具有焦点的内容?我如何知道全球焦点何时发生变化?

The*_*aot 8

您可以使用此Viewport信号。"gui_focus_changed"每次更改时,它都会为您提供具有焦点的控件。

您可以通过如下代码连接到它:

func ready() -> void:
    get_viewport().connect("gui_focus_changed", self, "_on_focus_changed")

func _on_focus_changed(control:Control) -> void:
    if control != null:
        print(control.name)
Run Code Online (Sandbox Code Playgroud)

顺便说一句,如果您查看get_focus_owner此处)的源代码,该代码会Control询问Viewport焦点所有者。Control您需要在场景树中使用它get_focus_owner

通过使用"gui_focus_changed",您不必使用_process每帧都运行的命令。因此,您的 CPU 使用率将会减少。


Godot 4 的附录: Control不再公开get_focus_owner,而是使用get_viewport().gui_get_focus_owner().