当玩家点击时,我试图通过信号将 3D 相机(位于玩家场景中)的位置和方向传递到世界场景,以产生具有该方向和位置的子弹。世界场景是玩家场景的父级,能够获取信息,但只有位置实际上有效,如果我出于某种原因传递位置和方向,它不会在正确的位置产生子弹
我尝试移动项目符号节点以使其正常工作
错误告诉您,您正在执行的操作无法在不在场景树上的
Node
上完成...要么:
Node
(即您尚未致电 add_child
)。Node
已被删除(因为remove_child
或queue_free
)。既然这是关于
Transform3D
,我猜这是关于读或写 global_transform
的 Node3D
。
注意:我将继续谈论
global_transform
,但这适用于global_position
,。 global_rotation
和 global_rotation_degrees
,因为为了方便起见,它们都是 global_transform
的简写。
现在,将
global_transform
设置在场景树之外并不是一个错误,但它会设置 transform
(这可以解释为什么你会在错误的位置生成子弹)。
虽然您可以通过设置
global_transform
after 来解决这个问题,但您将 Node3D
添加到场景树中,这可能会给碰撞器一个在 Godot 设置更新位置之前运行的机会。
所以,我会鼓励设置
transform
...让我们说:
Node3D
,我称之为 instance
。instance
放置在 desired_global_transform
。parent
的子级。然后你这样做:
instance.transform = parent.global_transform.affine_inverse() * desired_global_transform
parent.add_child(instance)
做作?是的,但我希望它能够解决错误的位置。
这个想法是,当
instance
作为 parent
的子级添加时,instance.global_transform
将是 parent.global_transform * instance.transform
...然后 parent.global_transform
与其逆相抵消,留下 desired_global_transform
。
但是获取不在场景树中的
global_transform
的 Node3D
是一个错误。
在这种情况下,您说您读取了
global_transform
的 Camera3D
...这让人相信 Camera3D
不在场景树中。
既然你说
Camera3D
是玩家场景的一部分,我猜整个场景都在场景树之外。
当然,您可以使用
is_inside_tree
进行检查,如果返回 false
,则不要运行代码。 如果您还在那里添加 breakpoint
,它可能会帮助您调试情况。