You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Control子节点的position与global_position均锁定为(0.0, 0.0)?

问题原因与解决办法

这是因为Godot的容器类(比如GridContainer)会在节点进入场景树后,延迟到第一帧更新前才完成子Control节点的布局计算。你在_ready()里直接获取位置时,容器还没来得及计算并设置子节点的实际位置,所以拿到的是初始默认值(0,0),而编辑器检查器里显示的是布局完成后的最终位置。

解决方法有两种:

1. 延迟调用获取位置的函数

用call_deferred()把获取位置的操作推迟到布局完成后执行:

extends GridContainer

@onready var color_rect_8 := $ColorRect8 #ColorRect8 is the 8th colorrect in the grid

func _ready():
    # 延迟执行,等待容器完成布局计算
    call_deferred("print_position")


func print_position() -> void:
    print(color_rect_8.position)
    print(color_rect_8.global_position)

2. 监听容器的resized信号

容器完成布局或尺寸变化时会触发resized信号,在这个信号回调里获取位置:

extends GridContainer

@onready var color_rect_8 := $ColorRect8 #ColorRect8 is the 8th colorrect in the grid

func _ready():
    # 绑定信号,布局更新时自动调用打印函数
    connect("resized", print_position)


func print_position() -> void:
    print(color_rect_8.position)
    print(color_rect_8.global_position)

补充说明:

  • Control节点的position由容器自动管理,编辑器检查器里的数值是布局完成后的结果,但在_ready阶段还未被容器赋值。
  • 解决位置获取问题后,把正确的global_position赋值给Node2D,它就能出现在正确位置了。

内容的提问来源于stack exchange,提问作者hamathan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 22:22:18