我不断收到错误条件“!is_inside_tree()”为真。返回:Transform3D()

问题描述 投票:0回答:1

当玩家点击时,我试图通过信号将 3D 相机(位于玩家场景中)的位置和方向传递到世界场景,以产生具有该方向和位置的子弹。世界场景是玩家场景的父级,能够获取信息,但只有位置实际上有效,如果我出于某种原因传递位置和方向,它不会在正确的位置产生子弹

我尝试移动项目符号节点以使其正常工作

3d godot treenode
1个回答
0
投票

错误告诉您,您正在执行的操作无法在不在场景树上的

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
,它可能会帮助您调试情况。

© www.soinside.com 2019 - 2024. All rights reserved.