Control.set_size
2026/4/14大约 4 分钟
最后同步日期:2026-04-15 | Godot 官方原文 — Control.set_size
Control.set_size
定义
Control.set_size 就是调整一个 UI 控件的大小——让它变宽、变窄、变高、变矮。就像你用手拉扯一个窗口的边框一样,你告诉引擎"这个控件宽 200 像素、高 100 像素",它就变成那个尺寸。
打个比方:每个 UI 控件就像一个可以伸缩的画框。set_size 就是决定画框有多大——画框越大,能装下的内容就越多。如果画框太小,里面的文字可能显示不全。
在实际游戏开发中,你需要动态调整控件大小的场景很多:比如血条变短表示受伤、进度条变长表示下载进度、对话框根据文字多少调整高度。
函数签名
C#
// 通过属性设置
public Vector2 Size { get; set; }
// 使用示例
control.Size = new Vector2(200, 100);GDScript
func set_size(size: Vector2, keep_offsets: bool = false) -> void
# 也可以直接用属性赋值:
# control.size = Vector2(200, 100)参数说明
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
size | Vector2 | 是 | 控件的新尺寸,X 是宽度,Y 是高度,单位是像素 |
keep_offsets | bool | 否 | 是否在调整大小时保留当前的偏移量,默认 false。通常不需要关心 |
返回值
无返回值(void)。设置后控件立即变为新尺寸。
代码示例
基础用法:设置控件大小
C#
var panel = GetNode<Control>("Panel");
panel.Size = new Vector2(400, 300);
// 运行结果: Panel 变成 400 像素宽、300 像素高
var button = GetNode<Button>("MyButton");
button.Size = new Vector2(200, 60);
// 运行结果: Button 变成 200 像素宽、60 像素高GDScript
var panel = $Panel as Control
panel.size = Vector2(400, 300)
# 运行结果: Panel 变成 400 像素宽、300 像素高
var button = $MyButton as Button
button.size = Vector2(200, 60)
# 运行结果: Button 变成 200 像素宽、60 像素高实际场景:血条根据血量动态缩放
C#
using Godot;
public partial class HealthBar : Control
{
private ColorRect _fillRect;
private float _maxHealth = 100.0f;
private float _currentHealth = 100.0f;
public override void _Ready()
{
_fillRect = GetNode<ColorRect>("FillRect");
UpdateHealthBar();
}
public void SetHealth(float health)
{
_currentHealth = Mathf.Clamp(health, 0, _maxHealth);
UpdateHealthBar();
}
private void UpdateHealthBar()
{
float ratio = _currentHealth / _maxHealth;
// 血条宽度按比例缩放,高度不变
_fillRect.Size = new Vector2(Size.X * ratio, _fillRect.Size.Y);
// 运行结果: 满血时填满,半血时宽度减半
GD.Print($"血量:{_currentHealth}/{_maxHealth},血条宽度:{_fillRect.Size.X}");
}
}GDScript
extends Control
@onready var _fill_rect: ColorRect = $FillRect
var _max_health: float = 100.0
var _current_health: float = 100.0
func _ready():
update_health_bar()
func set_health(health: float):
_current_health = clampf(health, 0, _max_health)
update_health_bar()
func update_health_bar():
var ratio = _current_health / _max_health
# 血条宽度按比例缩放,高度不变
_fill_rect.size = Vector2(size.x * ratio, _fill_rect.size.y)
# 运行结果: 满血时填满,半血时宽度减半
print("血量:%s/%s,血条宽度:%s" % [_current_health, _max_health, _fill_rect.size.x])进阶用法:自适应文字高度的对话框
C#
using Godot;
public partial class DialogBox : Control
{
private Label _textLabel;
private ColorRect _background;
[Export] public float ExPadding = 20.0f;
[Export] public float ExMinHeight = 80.0f;
public override void _Ready()
{
_textLabel = GetNode<Label>("TextLabel");
_background = GetNode<ColorRect>("Background");
}
public void ShowText(string text)
{
_textLabel.Text = text;
// 等一帧让 Label 计算好文字高度
Callable.From(() => ResizeToFit()).CallDeferred();
}
private void ResizeToFit()
{
// 获取文字实际需要的高度
float textHeight = _textLabel.GetContentMinimumSize().Y;
float newHeight = Mathf.Max(ExMinHeight, textHeight + ExPadding * 2);
Size = new Vector2(Size.X, newHeight);
_background.Size = Size;
// 运行结果: 对话框高度自动适应文字内容
GD.Print($"对话框高度调整为:{newHeight}");
}
}GDScript
extends Control
@onready var _text_label: Label = $TextLabel
@onready var _background: ColorRect = $Background
@export var padding: float = 20.0
@export var min_height: float = 80.0
func show_text(text: String):
_text_label.text = text
# 等一帧让 Label 计算好文字高度
resize_to_fit.call_deferred()
func resize_to_fit():
# 获取文字实际需要的高度
var text_height = _text_label.get_content_minimum_size().y
var new_height = maxf(min_height, text_height + padding * 2)
size = Vector2(size.x, new_height)
_background.size = size
# 运行结果: 对话框高度自动适应文字内容
print("对话框高度调整为:%s" % new_height)注意事项
- 受容器(Container)影响:如果控件是 VBoxContainer、HBoxContainer 等容器的子节点,手动设置 Size 可能被容器的布局逻辑覆盖。在这种情况下应该用容器的
custom_minimum_size属性。 - 最小尺寸 vs 实际尺寸:
Size是控件的实际大小。CustomMinimumSize是控件的最小允许尺寸。如果设置的 Size 小于最小尺寸,引擎会自动放大到最小尺寸。 - 右下角锚点的影响:如果右锚点和下锚点不是 0,调整 Size 的效果可能不符合预期,因为锚点会拉扯控件。通常调整大小时建议锚点都设为 0(左上角对齐)。
- 像素单位:尺寸使用屏幕像素。在适配不同分辨率时,建议结合
anchors_preset或容器布局使用。
