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

Godot 4.3:如何在_ready中确保Control的位置正确?

解决方案:正确获取控件全局位置的时机

你的问题核心是**_ready阶段控件的布局尚未完成**,此时获取的global_position还是未适配全屏/窗口尺寸的旧值,导致光标位置错误。以下是几种可靠的替代方案,比固定延迟更优雅:

1. 强制更新控件变换后直接调用

如果确定聚焦控件已初始化,可强制让控件同步最新的变换数据,直接获取正确的global_position:

func _ready():
    var focused_control = get_focused_control()
    # 强制更新控件的变换(包括global_position)
    focused_control.force_update_transform()
    # 此时设置光标位置会得到正确值
    mouse_cursor.global_position = focused_control.global_position

2. 等待一帧后执行

利用Godot的帧循环,等待第一帧处理完成后再设置位置,此时所有布局适配操作都会完成:

func _ready():
    # 先完成其他初始化逻辑
    await get_tree().process_frame
    set_mouse_to_focused_control()

func set_mouse_to_focused_control():
    mouse_cursor.global_position = get_focused_control().global_position

3. 监听根控件的尺寸变化信号

你的根控件是铺满CanvasLayer的,当窗口/全屏尺寸确定后,根控件会触发resized信号,此时子控件的布局也已同步完成:

func _ready():
    var root_control = $CanvasLayer/RootControl
    root_control.resized.connect(_on_root_layout_ready)

func _on_root_layout_ready():
    mouse_cursor.global_position = get_focused_control().global_position
    # 只需要执行一次,执行后断开信号
    $CanvasLayer/RootControl.resized.disconnect(_on_root_layout_ready)

为什么call_deferred没用?

call_deferred只是将函数调用推迟到当前帧的空闲阶段,但如果全屏模式下的尺寸适配操作是在call_deferred执行之后才完成的,仍然会拿到旧的坐标。上面的方案要么强制同步变换,要么等待布局完成的明确时机,比固定延迟更可靠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 07:22:39