当玩家站在移动的地板上时,会稍微偏移。

当玩家站在上下移动的平台上时,在向上移动过程中会略微陷入平台内部。同样,站在左右移动的平台时,也会出现轻微的左右偏移。有什么好的方法可以避免这种情况吗?


1 个赞

CharacterBody2D 之间由于物理判定会从“双方”触发,因此会出现此类行为。

关于解决方法,是否可以考虑以下两点之一?

  1. 不使用 GameObject 自身的碰撞体,而是将 AnimatableBody2D 作为 GameObject 的子对象创建,并在该子对象中使用 CollisionShape2D 来设置墙壁判定。

  2. 同样地,将 TileMapLayer 作为子对象使用,通过 TileMapLayer 创建移动平台。

  1. 除了被埋没的情况外,其他功能均正常。当我将 AnimatableBody2D 添加到可移动的地板上,并将其现有的 CollisionShape2D 设置为子对象时,出现了在地板之外位置出现不可见碰撞体的异常行为,导致无法正常工作。

  2. 尝试将可移动的地板放置在 TileMapLayer 上,但未观察到任何变化。

明白了……我先在本地试一下。

我进行了各种调查和测试。首先,前提是这个问题很大程度上是由Godot的规格引起的。

由于角色和地面双方都在进行物理处理,因此根据“地面移动”和“角色检测到移动后移动”的处理顺序,可能会发生重叠,而试图解决这一问题会导致移动并产生偏差。

结论是,不使用GameObject而使用AnimatableBody2D是解决方法。

如果您将以下对象放置在字段中并尝试乘坐,应该不会出现1像素的偏差。

animatablebody_test.zip (1.6 KB)

另一方面,如果直接使用它,应该无法过渡到着陆状态,因此需要用于检测的处理。我认为可能需要在Area2D等中创建处理,但我会向开发团队确认最佳方法是什么。

已确认,

由于AnimatableBody2D的Collision2D也能实现“物体墙壁判定与接触”的过渡,因此请使用之前的方案,并为AnimatableBody2D设置“组”,即可实现着陆!

如果是简单的平台,可以直接使用此方案;

若希望实现通过开关触发移动等动作,则建议使用信号等方式进行处理。

尝试了各种方法后,结果大致符合预期,但在上下移动的瞬间,主角会进入空中判定状态。这个问题可以解决吗?

如果是 AnimatableBody2D,应该可以通过设置 snaplength 来生效,所以将 snaplength 设置得长一些或许就能避免这个问题?不知您怎么看?

snaplength 是玩家端的设置吧?目前我将其设为 20 像素。
如果设置得过大,会出现异常行为,请问应该设置为多少比较合适?

这取决于平台的移动速度。

如果在一帧(0.016秒)内,距离超过 snaplength,吸附效果就会失效并导致漂浮。因此,如果将 snaplength 设置为略大于“平台移动速度 × 0.016"的数值(即加入一定的缓冲),应该就能实现吸附效果……

我尝试降低了速度,目前看起来功能正常。虽然速度会受到限制……但我觉得在可接受范围内。谢谢。

以下是正在验证的问题,如果您有任何想法,请不吝赐教:

  • 将可穿透地板设置为 AnimatableBody2D 时,会出现瞬间的落地判定。
    使用常规墙壁判定时,通过 OneWayCollision 创建的自下而上可穿透地板能正常工作;但改为 AnimatableBody2D 后,当从上方穿过时,似乎会瞬间判定为从下方发生接触。

  • 无法用头部碰撞 AnimatableBody2D 的天花板。
    即使勾选了“通过物体墙壁判定停止上升”,AnimatableBody2D 似乎仍不受该判定影响,导致无法停止上升。虽然可以通过在向上接触时执行将向量归零等操作来解决,但这似乎是一种略显不自然的设定。

这两点我们确认后会向开发团队报告。

这两项问题已在今天发布的1.0.21版本中修复。烦请确认。

关于两个问题,似乎功能正常。

……但是,无法降落在向上移动的平台上。虽然未进行详细验证,但回退到 ver1.06 后可以降落,这可能是近期碰撞判定修复导致的回归错误。

我在本地测试时似乎已经成功落地,能否请您提供更详细的信息?

当与沿 Path2D 移动的地板从下方接触时,正在尝试着陆。