Control.set_anchor_preset
2026/4/14大约 5 分钟
最后同步日期:2026-04-15 | Godot 官方原文 — Control.set_anchor_preset
Control.set_anchor_preset
定义
Control.set_anchor_preset 是一次性设置控件四个锚点(左、右、上、下)的快捷方法。锚点决定了控件如何"粘"在父容器上——就像你在墙上贴海报,可以用图钉固定海报的四个角。图钉钉在墙的不同位置,海报就会出现在不同地方,拉伸方式也不同。
打个比方:锚点就像弹性绳。锚点在左上角时,控件乖乖待在左上角;锚点在右下角时,控件跑右下角去;如果左锚点在左边、右锚点在右边,控件就会横向拉伸占满整个宽度。
Godot 提供了一组预定义的锚点组合(叫"预设"),比如"左上角"、"居中"、"全屏拉伸"等,你直接选一个预设就行,不用手动设置四个锚点。
函数签名
C#
public void SetAnchorsPreset(Control.LayoutPreset preset, bool keepOffsets = true)GDScript
func set_anchors_preset(preset: int, keep_offsets: bool = true) -> void参数说明
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
preset | LayoutPreset (int) | 是 | 锚点预设值,决定控件如何定位和缩放。常用值见下表 |
keep_offsets | bool | 否 | 是否保留当前的偏移值,默认 true。设为 false 时偏移会重置为 0 |
常用预设值
| 预设 | 值 | 效果 |
|---|---|---|
PresetTopLeft | 0 | 锚定在左上角 |
PresetTopRight | 1 | 锚定在右上角 |
PresetBottomRight | 2 | 锚定在右下角 |
PresetBottomLeft | 3 | 锚定在左下角 |
PresetCenterLeft | 4 | 锚定在左侧垂直居中 |
PresetCenterTop | 5 | 锚定在顶部水平居中 |
PresetCenterRight | 6 | 锚定在右侧垂直居中 |
PresetCenterBottom | 7 | 锚定在底部水平居中 |
PresetCenter | 8 | 锚定在正中央 |
PresetLeftWide | 9 | 左侧占满全高 |
PresetTopWide | 10 | 顶部占满全宽 |
PresetRightWide | 11 | 右侧占满全高 |
PresetBottomWide | 12 | 底部占满全宽 |
PresetVCenterWide | 13 | 垂直居中占满全宽 |
PresetHCenterWide | 14 | 水平居中占满全高 |
PresetFullRect | 15 | 占满整个父容器 |
返回值
无返回值(void)。设置后锚点立即更新。
代码示例
基础用法:将控件锚定在不同位置
C#
var button = GetNode<Button>("MyButton");
// 将按钮锚定在左上角
button.SetAnchorsPreset(Control.LayoutPreset.PresetTopLeft);
// 运行结果: 按钮固定在父容器左上角
// 将按钮锚定在正中央
button.SetAnchorsPreset(Control.LayoutPreset.PresetCenter);
// 运行结果: 按钮固定在父容器正中央
// 让控件占满整个父容器
var background = GetNode<ColorRect>("Background");
background.SetAnchorsPreset(Control.LayoutPreset.PresetFullRect);
// 运行结果: 背景铺满整个父容器GDScript
var button = $MyButton as Button
# 将按钮锚定在左上角
button.set_anchors_preset(Control.PRESET_TOP_LEFT)
# 运行结果: 按钮固定在父容器左上角
# 将按钮锚定在正中央
button.set_anchors_preset(Control.PRESET_CENTER)
# 运行结果: 按钮固定在父容器正中央
# 让控件占满整个父容器
var background = $Background as ColorRect
background.set_anchors_preset(Control.PRESET_FULL_RECT)
# 运行结果: 背景铺满整个父容器实际场景:设置 HUD 界面布局
C#
using Godot;
public partial class GameHUD : Control
{
public override void _Ready()
{
// 生命值:左上角
var healthBar = GetNode<Control>("HealthBar");
healthBar.SetAnchorsPreset(Control.LayoutPreset.PresetTopLeft);
// 分数:顶部居中
var scoreLabel = GetNode<Control>("ScoreLabel");
scoreLabel.SetAnchorsPreset(Control.LayoutPreset.PresetCenterTop);
// 小地图:右上角
var minimap = GetNode<Control>("Minimap");
minimap.SetAnchorsPreset(Control.LayoutPreset.PresetTopRight);
// 技能栏:底部居中
var skillBar = GetNode<Control>("SkillBar");
skillBar.SetAnchorsPreset(Control.LayoutPreset.PresetCenterBottom);
// 背景遮罩:铺满全屏
var overlay = GetNode<Control>("Overlay");
overlay.SetAnchorsPreset(Control.LayoutPreset.PresetFullRect);
// 运行结果: 各个 UI 元素自动对齐到屏幕对应位置
}
}GDScript
extends Control
func _ready():
# 生命值:左上角
var health_bar = $HealthBar as Control
health_bar.set_anchors_preset(Control.PRESET_TOP_LEFT)
# 分数:顶部居中
var score_label = $ScoreLabel as Control
score_label.set_anchors_preset(Control.PRESET_CENTER_TOP)
# 小地图:右上角
var minimap = $Minimap as Control
minimap.set_anchors_preset(Control.PRESET_TOP_RIGHT)
# 技能栏:底部居中
var skill_bar = $SkillBar as Control
skill_bar.set_anchors_preset(Control.PRESET_CENTER_BOTTOM)
# 背景遮罩:铺满全屏
var overlay = $Overlay as Control
overlay.set_anchors_preset(Control.PRESET_FULL_RECT)
# 运行结果: 各个 UI 元素自动对齐到屏幕对应位置进阶用法:运行时动态切换锚点布局
C#
using Godot;
public partial class ResponsivePanel : Control
{
private Control _sidePanel;
private Control _mainContent;
public override void _Ready()
{
_sidePanel = GetNode<Control>("SidePanel");
_mainContent = GetNode<Control>("MainContent");
UpdateLayout();
}
public override void _Notification(int what)
{
// 当父容器尺寸变化时重新调整布局
if (what == NotificationResized)
{
UpdateLayout();
}
}
private void UpdateLayout()
{
if (Size.X > 800)
{
// 宽屏:侧边栏在左,主内容在右
_sidePanel.SetAnchorsPreset(Control.LayoutPreset.PresetLeftWide, false);
_sidePanel.Size = new Vector2(250, Size.Y);
_mainContent.SetAnchorsPreset(Control.LayoutPreset.PresetRightWide, false);
// 运行结果: 宽屏时左右分栏布局
}
else
{
// 窄屏:只显示主内容,铺满全屏
_sidePanel.Visible = false;
_mainContent.SetAnchorsPreset(Control.LayoutPreset.PresetFullRect, false);
// 运行结果: 窄屏时全屏显示主内容
}
}
}GDScript
extends Control
@onready var _side_panel: Control = $SidePanel
@onready var _main_content: Control = $MainContent
func _ready():
update_layout()
func _notification(what):
# 当父容器尺寸变化时重新调整布局
if what == NOTIFICATION_RESIZED:
update_layout()
func update_layout():
if size.x > 800:
# 宽屏:侧边栏在左,主内容在右
_side_panel.set_anchors_preset(Control.PRESET_LEFT_WIDE, false)
_side_panel.size = Vector2(250, size.y)
_main_content.set_anchors_preset(Control.PRESET_RIGHT_WIDE, false)
# 运行结果: 宽屏时左右分栏布局
else:
# 窄屏:只显示主内容,铺满全屏
_side_panel.visible = false
_main_content.set_anchors_preset(Control.PRESET_FULL_RECT, false)
# 运行结果: 窄屏时全屏显示主内容注意事项
keep_offsets参数很重要:默认为true,表示设置锚点后保留控件当前的位置和大小偏移。如果设为false,偏移会被重置为 0,控件可能会跳到新位置。- 编辑器 vs 代码:在编辑器中可以直接点击"布局"按钮选择锚点预设。在代码中使用
set_anchors_preset是程序化设置的方式。 - 容器子节点慎用:如果控件是 Container 的子节点,容器会自动管理子节点布局,手动设置锚点可能无效或被覆盖。
- 锚点和偏移的区别:锚点(0-1 之间的比例值)决定"粘在哪里",偏移(像素值)决定"离锚点多远"。两者共同决定控件的最终位置和大小。
