Control
2026/4/14大约 4 分钟
最后同步日期:2026-04-15 | Godot 官方原文 — Control
Control
节点继承关系
继承链:Node → CanvasItem → Control
定义
Control 是所有 UI 控件的"老祖宗"。你不会直接在场景里使用 Control 本身(虽然也可以),但几乎所有你在编辑器里拖拽的 UI 节点——按钮、文字、图片、进度条——都是 Control 的"子孙后代"。
打个比方:如果 UI 控件是一棵家族树,Control 就是树根。你不需要"成为"树根,但你需要知道树根提供了哪些能力给所有后代。
使用频率:★★★★★ 通用高频(所有 UI 的基类,几乎每个项目都间接使用)
节点用途
- 定义 UI 控件的基本布局能力(位置、大小、锚点)
- 提供鼠标和输入事件的公共接口
- 作为其他所有 UI 节点的父类
使用场景
- 直接作为 UI 场景的根节点
- 作为不规则的容器,手动摆放子控件
- 制作自定义控件时继承它
常用节点搭配
- 搭配
Panel作为有背景的面板 - 搭配各种
Container实现自动布局
生效必备素材/资源
无需特殊资源,Control 本身就是一个空白的 UI 节点。
核心布局概念
UI 控件怎么摆放?这是初学者最容易迷糊的地方。别急,我们用"墙上贴便签纸"来类比:
| 概念 | 生活类比 | 说明 |
|---|---|---|
| 锚点 (Anchor) | 便签纸贴在墙上的那个"钉子" | 锚点决定了控件相对于父容器的"参照点"。比如锚点设在右上角,控件就会跟着右上角走 |
| 偏移 (Offset) | 钉子固定后,便签纸向左/右/上/下挪了多少 | 锚点定了参照位置后,偏移决定了控件相对于锚点的精确距离 |
| 容器 (Container) | 一个画了格子的展示板 | 容器会自动帮你摆放子控件,你只需要说"水平排"还是"垂直排" |
节点属性与信号
布局属性
| 属性 | 类型 | 默认值 | 继承自 | 说明 |
|---|---|---|---|---|
size | Vector2 | (0, 0) | — | 控件的大小(宽,高) |
position | Vector2 | (0, 0) | — | 控件相对于父节点的位置 |
global_position | Vector2 | (0, 0) | — | 控件在屏幕上的绝对位置(只读) |
anchor_left | float | 0.0 | — | 左侧锚点(0=左边缘,1=右边缘) |
anchor_right | float | 0.0 | — | 右侧锚点 |
anchor_top | float | 0.0 | — | 顶部锚点 |
anchor_bottom | float | 0.0 | — | 底部锚点 |
offset_left | float | 0.0 | — | 左侧偏移 |
offset_right | float | 0.0 | — | 右侧偏移 |
offset_top | float | 0.0 | — | 顶部偏移 |
offset_bottom | float | 0.0 | — | 底部偏移 |
anchor_preset | 枚举 | TopLeft | — | 预设的锚点位置 |
custom_minimum_size | Vector2 | (0, 0) | — | 控件的最小尺寸 |
外观属性
| 属性 | 类型 | 默认值 | 继承自 | 说明 |
|---|---|---|---|---|
visible | bool | true | CanvasItem | 是否可见 |
modulate | Color | 白色 | CanvasItem | 颜色调制(用于调色调透明度) |
mouse_filter | 枚举 | Stop | — | 鼠标事件过滤:Stop(拦截)、Pass(穿透)、Ignore(忽略) |
mouse_default_cursor_shape | 枚举 | Arrow | — | 鼠标悬停时的光标样式 |
信号
| 信号 | 触发时机 | 参数 |
|---|---|---|
gui_input | 用户在控件上进行了输入操作(点击、拖拽等) | InputEvent 事件对象 |
mouse_entered | 鼠标移入控件区域 | 无 |
mouse_exited | 鼠标移出控件区域 | 无 |
resized | 控件大小发生变化 | 无 |
focus_entered | 控件获得焦点 | 无 |
focus_exited | 控件失去焦点 | 无 |
theme_changed | 主题被更换 | 无 |
visibility_changed | 可见性发生变化 | 无 |
常用方法
| 方法 | 说明 |
|---|---|
SetAnchorsPreset(preset) | 设置预设锚点(如 LayoutPreset.FullRect 铺满父节点) |
SetAnchorsAndOffsetsPreset(preset) | 同时设置锚点和偏移 |
GrabFocus() | 让控件获得键盘焦点 |
ReleaseFocus() | 释放焦点 |
GetGlobalMousePosition() | 获取鼠标在屏幕上的位置 |
SetSize(Vector2) | 设置控件大小 |
代码示例
C
using Godot;
// 动态创建一个 Control 并设置基本属性
public partial class MyUI : Control
{
public override void _Ready()
{
// 创建一个面板作为背景
var panel = new Panel();
panel.SetAnchorsPreset(LayoutPreset.Center); // 锚点:居中
panel.Position = new Vector2(-150, -50); // 偏移到中心附近
panel.Size = new Vector2(300, 100); // 宽 300,高 100
AddChild(panel);
// 鼠标进入面板时触发
panel.MouseEntered += () =>
{
GD.Print("鼠标进入了面板");
};
// 鼠标离开面板时触发
panel.MouseExited += () =>
{
GD.Print("鼠标离开了面板");
};
}
}GDScript
extends Control
func _ready():
# 创建一个面板作为背景
var panel = Panel.new()
panel.set_anchors_preset(Control.LayoutPreset.CENTER) # 锚点:居中
panel.position = Vector2(-150, -50) # 偏移到中心附近
panel.size = Vector2(300, 100) # 宽 300,高 100
add_child(panel)
# 鼠标进入面板时触发
panel.mouse_entered.connect(func():
print("鼠标进入了面板")
)
# 鼠标离开面板时触发
panel.mouse_exited.connect(func():
print("鼠标离开了面板")
)