You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Godot如何获取当前持有焦点的Control节点及监听全局焦点变化?

Godot 全局Control节点焦点查询与监听方案

查询当前持有焦点的Control节点

你可以直接调用当前Viewport的get_focus_owner()方法获取当前持有键盘焦点的Control节点:

# 任意脚本中调用,返回值为Control类型,无焦点时返回null
var focused_control = get_viewport().get_focus_owner()

如果要判断某一个Control节点是否持有焦点,直接比对返回值即可,不需要到目标节点内部调用has_focus()。

监听全局焦点变更事件

你不需要跨节点连接各个Control的focus_entered/focus_exited信号,直接监听Viewport的gui_focus_changed信号即可,该信号会在全局焦点发生变化时自动触发,参数为新获得焦点的Control节点(无节点获得焦点时参数为null):

示例代码(GDScript)

func _ready():
    # 连接全局焦点变更信号
    get_viewport().connect("gui_focus_changed", callable(self, "_on_global_focus_changed"))

func _on_global_focus_changed(new_focus: Control):
    # 在这里处理焦点变更逻辑
    if new_focus:
        print("当前获得焦点的节点:", new_focus.name)
    else:
        print("当前无节点持有焦点")

如果你的项目有全局Autoload单例,也可以把这段逻辑放到单例中,在项目任意位置都可以监听或查询焦点状态。

兼容旧版本的兜底方案

如果你使用的Godot版本低于3.2,没有内置gui_focus_changed信号,可以通过Autoload单例每帧比对焦点节点的方式实现自定义监听:

# 全局Autoload单例脚本
var last_focus: Control = null
signal global_focus_changed(new_focus)

func _process(delta):
    var current_focus = get_viewport().get_focus_owner()
    if current_focus != last_focus:
        last_focus = current_focus
        global_focus_changed.emit(current_focus)

其他脚本只需要监听这个单例的global_focus_changed信号即可。

内容的提问来源于stack exchange,提问作者Kyle Pollard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 03:06:03