Godot - 如何在子节点中定义碰撞来设置模块化角色?



我正在尝试在我的2d游戏中建造"模块化"飞船,这意味着一艘船有船体,发动机,大炮等,每个都是自己的场景。 一艘船可以这样设置

Ship   
|- Hull  
|- Sprite   
|- CollisionShape
|- Engine  
|- Sprite   
|- CollisionShape
|- ParticleSystem

现在我遇到了以下问题。我将"船舶"节点设置为"运动学Body2D",因为我使用该节点进行移动。 但是碰撞应该来自子场景(船体、发动机等(。 所以我把它们也做了运动体,并添加了碰撞形状。

然而,这不起作用,因为飞船需要一个碰撞形状子级(KinematicBody2D(,并且它在嵌套的场景中(船体、发动机等(是不够的。此外,如果我移动 Ship 节点 move_and_collide/_slide子节点不会发生冲突。

我认为我目前的做法不正确。 我能做些什么来做到这一点,而不会破坏我的模块化,将子碰撞形状移动到船上?

作为一个PhysicsBody2D,如果你想让它与其他物理体碰撞,KinematicBody2D需要碰撞形状。因此,您可以向Ship节点添加一个形状,该形状将适合整个飞船或略小于它。

当然,解决方案不止一种。一种可能的方法表明,您可以将船舶元素(发动机、船体、大炮等(作为Area2D节点。使用Area2D信号和_on_Area2D_area_entered(area)方法,您可以为每种类型的舰船模块编写事件的独特响应,例如与敌方子弹的碰撞。

Ship (KinematicBody2D)   
|
|__CollisionShape2D
|
|__Hull (Area2D)
|  |_Sprite   
|  |_CollisionShape2D
|
|__Engine (Area2D)  
|_Sprite   
|_CollisionShape2D
|_ParticleSystem

我知道这个问题很旧,直到昨天我才有同样的问题并找到了解决方案,所以这里是为任何仍然遇到这个问题的人创建模块化场景

:在船舶运动学主体中,为每个船舶模块创建一个碰撞形状(如果您愿意,可以通过代码添加它(,并通过编码使您为每个模块创建的每个碰撞形状从相关模块场景中存在的碰撞形状中获得范围转换(碰撞形状.形状.extents.transform((您只需使用它们来获取您设置的形状, 模块不需要物理体,因为您只需要来自碰撞范围的数据(。

最新更新