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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 17:25:12