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

启用sync_to_physics时,如何获取KinematicBody2D的global_position?

问题分析

当KinematicBody2D启用sync_to_physics时,其位置更新会在物理线程中完成,而_draw()属于主线程(渲染流程)的回调,直接读取global_position拿到的是主线程未同步的旧值,导致绘制偏移。窗口调整时Godot会强制同步场景树变换,所以位置暂时恢复正常。

可靠解决方案

以下是两种实用的解决方法:

方法1:直接获取物理线程的最新变换

使用get_physics_global_transform()方法,它会直接从物理线程读取KinematicBody2D的最新全局变换,无需额外缓存:

extends Node2D

onready var item = $Item

func _physics_process(delta):
    global_position.y += 3000 * delta

func _draw():
    # 获取物理线程中的最新全局位置
    var item_physics_pos = item.get_physics_global_transform().origin
    var local_pos = to_local(item_physics_pos)
    draw_line(
        local_pos - Vector2(100, 0),
        local_pos + Vector2(100, 0),
        Color.violet
    )

方法2:在物理线程缓存位置

在_physics_process(物理线程回调)中提前缓存Item的最新位置,供_draw()使用:

extends Node2D

onready var item = $Item
var cached_item_global_pos: Vector2

func _physics_process(delta):
    global_position.y += 3000 * delta
    # 物理线程中获取最新位置并缓存
    cached_item_global_pos = item.global_position

func _draw():
    var local_pos = to_local(cached_item_global_pos)
    draw_line(
        local_pos - Vector2(100, 0),
        local_pos + Vector2(100, 0),
        Color.violet
    )

可选方案:关闭sync_to_physics(按需使用)

如果Item不需要独立的物理线程更新(仅跟随Holder移动),可以直接关闭Item的sync_to_physics选项,此时global_position会和主线程实时同步,无需额外处理。

内容的提问来源于stack exchange,提问作者Manas R. Makde

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 00:22:15