【问题标题】:Godot - How to set up a modular character with collision being defined in the child nodes?Godot - 如何设置在子节点中定义碰撞的模块化角色?
【发布时间】:2023-03-04 12:34:01
【问题描述】:

我正在尝试在我的 2d 游戏中构建“模块化”船舶,这意味着一艘船有一个船体、一个引擎、大炮等。每一个都是一个自己的场景。 一艘船可以这样设置

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

现在我遇到了以下问题。我将 Ship 节点设置为 KinematicBody2D,因为我使用该节点进行移动。 但是碰撞应该来自子场景(船体,引擎等)。 所以我也制作了 KinematicBodies 并添加了 CollisionShapes。

但这不起作用,因为 Ship 需要一个 CollisionShape 子对象 (KinematicBody2D) 并且它位于嵌套场景(船体、引擎等)中是不够的。此外,如果我使用 move_and_collide/_slide 移动 Ship 节点,则子节点不会发生碰撞。

我不认为我目前的做法是正确的。 通过将子 CollisionShapes 移动到 Ship 上,我可以做些什么来在不破坏模块化的情况下完成此操作?

【问题讨论】:

  • KinematicBody2D 无论如何都需要自己的碰撞形状。您能否澄清一下,“模块化”对您的船舶意味着什么。是像国际空间站还是别的什么?所有模块总是一起移动还是可以分开并独立移动?
  • 对于模块化我的意思是船由不同的部分组成,例如驾驶舱、货舱、发动机等。这些模块应该作为一个整体一起移动。我尝试并取得了一些成功,即为每个部件/模块提供正确的碰撞形状并在加载时重新设置它们。但这并不真正正确......

标签: godot


【解决方案1】:

作为PhysicsBody2DKinematicBody2D 需要碰撞形状才能与其他物理体发生碰撞。因此,您可以向Ship 节点添加一个适合整艘船或略小于它的形状。

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

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

【讨论】:

  • 如果我想动态改变飞船的某些部分,例如引擎,我必须重新计算父级 CollisionShape2D?
【解决方案2】:

我知道这个问题很老了,直到昨天我也有同样的问题并找到了解决方案,所以这里适用于仍然有这个问题的人创建模块化场景:

在 Ship Kinematicbody 中,为每个船模块创建一个 CollisionShape(如果您愿意,可以通过代码添加它)并通过编码使您为每个模块创建的每个 CollisionShape 获得范围变换(collisionshape.shape.extents.transform ) 来自各自模块场景中存在的 CollisionShape(您只需使用它们来获取您设置的形状,不需要模块是物理体,因为您只需要来自碰撞范围的数据)。

【讨论】:

    猜你喜欢
    • 2021-12-12
    • 2021-06-28
    • 2022-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-18
    • 1970-01-01
    • 2015-07-26
    相关资源
    最近更新 更多