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
相关产品推荐
相关产品推荐

