Control.set_position
2026/4/14大约 4 分钟
最后同步日期:2026-04-15 | Godot 官方原文 — Control.set_position
Control.set_position
定义
Control.set_position 就是把一个 UI 控件(按钮、标签、图片等)移动到屏幕上的指定位置。就像你在桌子上挪动一张卡片——你告诉引擎"把这个控件放在坐标 (100, 200) 的位置",它就移过去了。
打个比方:想象屏幕是一张画布,每个 UI 控件是一张贴纸。set_position 就是决定贴纸的左上角贴在画布的哪个位置。坐标 (0, 0) 是画布左上角,往右 X 增大,往下 Y 增大。
在实际游戏开发中,你经常需要用代码动态移动 UI 元素——比如让伤害数字飘起来、让对话框滑入画面、让按钮移动到鼠标附近。
函数签名
C#
// 通过属性设置
public Vector2 Position { get; set; }
// 使用示例
control.Position = new Vector2(100, 200);GDScript
func set_position(position: Vector2, keep_offsets: bool = false) -> void
# 也可以直接用属性赋值:
# control.position = Vector2(100, 200)参数说明
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
position | Vector2 | 是 | 控件的新位置,X 向右增大,Y 向下增大,单位是像素 |
keep_offsets | bool | 否 | 是否在移动时保留当前的偏移量,默认 false。通常不需要关心 |
返回值
无返回值(void)。设置后控件立即移到新位置。
代码示例
基础用法:移动控件位置
C#
var panel = GetNode<Control>("Panel");
panel.Position = new Vector2(100, 50);
// 运行结果: Panel 移动到 (100, 50) 的位置
var button = GetNode<Button>("MyButton");
button.Position = new Vector2(200, 300);
// 运行结果: Button 移动到 (200, 300) 的位置GDScript
var panel = $Panel as Control
panel.position = Vector2(100, 50)
# 运行结果: Panel 移动到 (100, 50) 的位置
var button = $MyButton as Button
button.position = Vector2(200, 300)
# 运行结果: Button 移动到 (200, 300) 的位置实际场景:让伤害数字从敌人头顶飘起
C#
using Godot;
public partial class DamageNumber : Label
{
private float _lifetime = 1.0f;
private float _speed = 50.0f;
public override void _Process(double delta)
{
// 每帧向上飘动
Position = new Vector2(Position.X, Position.Y - _speed * (float)delta);
// 运行结果: 数字不断向上飘动
_lifetime -= (float)delta;
if (_lifetime <= 0)
{
QueueFree();
}
}
public void ShowDamage(int damage, Vector2 startPos)
{
Text = damage.ToString();
Position = startPos;
// 运行结果: 在 startPos 位置显示伤害数字,然后向上飘动
}
}GDScript
extends Label
var _lifetime: float = 1.0
var _speed: float = 50.0
func _process(delta):
# 每帧向上飘动
position = Vector2(position.x, position.y - _speed * delta)
# 运行结果: 数字不断向上飘动
_lifetime -= delta
if _lifetime <= 0:
queue_free()
func show_damage(damage: int, start_pos: Vector2):
text = str(damage)
position = start_pos
# 运行结果: 在 start_pos 位置显示伤害数字,然后向上飘动进阶用法:平滑移动 UI 面板到目标位置
C#
using Godot;
public partial class SlidingPanel : Control
{
[Export] public float ExSlideSpeed = 5.0f;
private Vector2 _targetPosition;
private bool _isSliding = false;
public override void _Ready()
{
_targetPosition = Position;
}
public override void _Process(double delta)
{
if (!_isSliding) return;
// 平滑插值移动到目标位置
Position = Position.Lerp(_targetPosition, ExSlideSpeed * (float)delta);
// 距离足够近时停止
if (Position.DistanceTo(_targetPosition) < 0.5f)
{
Position = _targetPosition;
_isSliding = false;
GD.Print("面板滑动完成!");
// 运行结果: 面板平滑滑动到目标位置后打印提示
}
}
public void SlideTo(Vector2 target)
{
_targetPosition = target;
_isSliding = true;
// 运行结果: 开始平滑滑动到指定位置
}
}GDScript
extends Control
@export var slide_speed: float = 5.0
var _target_position: Vector2
var _is_sliding: bool = false
func _ready():
_target_position = position
func _process(delta):
if not _is_sliding:
return
# 平滑插值移动到目标位置
position = position.lerp(_target_position, slide_speed * delta)
# 距离足够近时停止
if position.distance_to(_target_position) < 0.5:
position = _target_position
_is_sliding = false
print("面板滑动完成!")
# 运行结果: 面板滑动到目标位置后打印提示
func slide_to(target: Vector2):
_target_position = target
_is_sliding = true
# 运行结果: 开始平滑滑动到指定位置注意事项
- Position 是相对于父节点的:坐标 (0, 0) 不是屏幕左上角,而是父容器的左上角。如果你的控件放在一个 Panel 里,那 (0, 0) 是 Panel 的左上角。
- 受锚点(Anchor)和容器(Container)影响:如果控件是 Container(如 VBoxContainer、HBoxContainer)的子节点,Container 会自动管理子节点的位置,手动设置 Position 可能被覆盖。
- set_position vs position 属性:GDScript 中
set_position(pos)和position = pos效果一样。C# 中推荐直接用Position属性。 - 像素单位:位置坐标使用的是屏幕像素,在 1920x1080 的屏幕上,X 范围约 0-1920,Y 范围约 0-1080。
