Godot 4 GDScript获取父节点位置异常:返回(0,0)而非预期(0,80)
Godot 4中在_ready方法获取父节点位置返回(0,0)的解决办法
问题重现
在Godot 4的GDScript中,尝试在_ready方法内获取父节点的相对位置,预期得到(0,80),但实际返回(0,0)。单独执行og_position = animObj.position能得到正确值,但在_ready中调用就失效。
代码示例:
extends Node var og_position:Vector2 var og_scale:Vector2 var og_rotation:float var og_size:Vector2 @onready var animObj = get_parent() func _ready(): _set_originals() func _set_originals(): og_position = animObj.position og_scale = animObj.scale og_rotation = animObj.rotation og_size = animObj.size # Debug print(og_position) print(og_scale) print(og_rotation) print(og_size)
原因分析
Godot中_ready方法的调用顺序是从子节点到父节点,子节点的_ready会先于父节点执行。如果父节点的位置是在自身_ready方法或更晚时机才设置的,子节点在自己的_ready中获取到的就是父节点的初始默认位置(0,0)。而调试控制台执行代码时,整个场景树已完成初始化,父节点位置已正确设置,因此能拿到预期值。
解决方案
方法1:使用
call_deferred延迟执行
将属性获取逻辑延迟到当前帧末尾执行,确保父节点初始化完成:func _ready(): call_deferred("_set_originals")方法2:监听父节点的
ready信号
等待父节点完成ready回调后再获取属性:@onready var animObj = get_parent() func _ready(): animObj.connect("ready", Callable(self, "_set_originals"))方法3:在
_process中仅执行一次
利用_process每帧执行的特性,只在第一帧完成属性获取:var has_set_originals = false func _process(delta): if not has_set_originals: _set_originals() has_set_originals = true
内容的提问来源于stack exchange,提问作者Yentrix
相关产品推荐
相关产品推荐

