Control.release_focus
2026/4/14大约 4 分钟
最后同步日期:2026-04-15 | Godot 官方原文 — Control.release_focus
Control.release_focus
定义
Control.release_focus 就是让当前拥有焦点的控件"放弃焦点"——也就是取消选中状态。调用后,这个控件不再高亮显示,也不再接收键盘输入。
打个比方:你在填表格,当前正在填写"姓名"那一栏(焦点在姓名输入框)。release_focus 就像你放下笔,不再填任何一栏——没有任何输入框被选中了。
在实际游戏开发中,你经常需要在特定时机让控件失去焦点:比如玩家输入完聊天内容后按回车发送,输入框应该失去焦点,这样键盘输入就不会继续打在输入框里;或者在游戏战斗时让所有 UI 失去焦点,避免误触。
函数签名
C#
public void ReleaseFocus()GDScript
func release_focus() -> void参数说明
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
| 无 | — | — | 此方法没有参数 |
返回值
无返回值(void)。调用后控件立即失去焦点。
代码示例
基础用法:让控件失去焦点
C#
var inputField = GetNode<LineEdit>("ChatInput");
inputField.ReleaseFocus();
// 运行结果: ChatInput 失去焦点,光标消失,键盘输入不再影响它
var button = GetNode<Button>("MyButton");
button.ReleaseFocus();
// 运行结果: 按钮取消高亮,不再处于选中状态GDScript
var input_field = $ChatInput as LineEdit
input_field.release_focus()
# 运行结果: ChatInput 失去焦点,光标消失,键盘输入不再影响它
var button = $MyButton as Button
button.release_focus()
# 运行结果: 按钮取消高亮,不再处于选中状态实际场景:聊天输入框发送消息后自动失去焦点
C#
using Godot;
public partial class ChatUI : Control
{
private LineEdit _chatInput;
private RichTextLabel _chatLog;
public override void _Ready()
{
_chatInput = GetNode<LineEdit>("ChatInput");
_chatLog = GetNode<RichTextLabel>("ChatLog");
}
public override void _Input(InputEvent evt)
{
// 按回车发送消息
if (evt.IsActionPressed("ui_text_submit") && _chatInput.HasFocus())
{
string message = _chatInput.Text.Trim();
if (!string.IsNullOrEmpty(message))
{
_chatLog.AppendText($"[你] {message}\n");
// 运行结果: 聊天记录中显示发送的消息
}
_chatInput.Text = "";
_chatInput.ReleaseFocus();
// 运行结果: 发送消息后输入框清空并失去焦点,键盘恢复游戏控制
}
// 按 Tab 键重新聚焦到输入框
if (evt.IsActionPressed("open_chat"))
{
_chatInput.GrabFocus();
}
}
}GDScript
extends Control
@onready var _chat_input: LineEdit = $ChatInput
@onready var _chat_log: RichTextLabel = $ChatLog
func _input(evt):
# 按回车发送消息
if evt.is_action_pressed("ui_text_submit") and _chat_input.has_focus():
var message = _chat_input.text.strip_edges()
if message != "":
_chat_log.append_text("[你] %s\n" % message)
# 运行结果: 聊天记录中显示发送的消息
_chat_input.text = ""
_chat_input.release_focus()
# 运行结果: 发送消息后输入框清空并失去焦点
# 按 Tab 键重新聚焦到输入框
if evt.is_action_pressed("open_chat"):
_chat_input.grab_focus()进阶用法:在游戏战斗时移除所有 UI 焦点
C#
using Godot;
public partial class GameManager : Node
{
private Control _gameHUD;
private bool _isInCombat = false;
public override void _Ready()
{
_gameHUD = GetNode<Control>("GameHUD");
}
public void EnterCombat()
{
_isInCombat = true;
// 让当前拥有焦点的控件失去焦点
var focusedOwner = GetViewport().GuiGetFocusOwner();
focusedOwner?.ReleaseFocus();
// 运行结果: 进入战斗后所有 UI 控件失去焦点,键盘输入不会被 UI 拦截
GD.Print("进入战斗模式,UI 焦点已清除");
}
public void ExitCombat()
{
_isInCombat = false;
// 战斗结束后让背包按钮重新获得焦点
var inventoryButton = _gameHUD.GetNode<Button>("InventoryButton");
inventoryButton.GrabFocus();
// 运行结果: 战斗结束后背包按钮自动获得焦点
}
}GDScript
extends Node
@onready var _game_hud: Control = $GameHUD
var _is_in_combat: bool = false
func enter_combat():
_is_in_combat = true
# 让当前拥有焦点的控件失去焦点
var focused_owner = get_viewport().gui_get_focus_owner()
if focused_owner:
focused_owner.release_focus()
# 运行结果: 进入战斗后所有 UI 控件失去焦点
print("进入战斗模式,UI 焦点已清除")
func exit_combat():
_is_in_combat = false
# 战斗结束后让背包按钮重新获得焦点
var inventory_button = _game_hud.get_node("InventoryButton") as Button
inventory_button.grab_focus()
# 运行结果: 战斗结束后背包按钮自动获得焦点注意事项
- 只在控件拥有焦点时有效:如果控件本来就没有焦点,调用
ReleaseFocus()不会有任何效果,也不会报错。 - 通过 Viewport 查询当前焦点:可以用
GetViewport().GuiGetFocusOwner()获取当前拥有焦点的控件,然后对它调用ReleaseFocus()。 - 焦点释放后键盘事件恢复:控件失去焦点后,键盘输入不再被该控件拦截,
_UnhandledInput等方法可以正常接收到键盘事件。 - 与
GrabFocus()配合使用:通常在让 A 失去焦点的同时会让 B 获得焦点。如果只是调用ReleaseFocus()而不指定新的焦点目标,界面上可能没有任何控件被选中。
