启用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
相关产品推荐
相关产品推荐

