当玩家站在上下移动的平台上时,在向上移动过程中会略微陷入平台内部。同样,站在左右移动的平台时,也会出现轻微的左右偏移。有什么好的方法可以避免这种情况吗?
CharacterBody2D 之间由于物理判定会从“双方”触发,因此会出现此类行为。
关于解决方法,是否可以考虑以下两点之一?
-
不使用 GameObject 自身的碰撞体,而是将 AnimatableBody2D 作为 GameObject 的子对象创建,并在该子对象中使用 CollisionShape2D 来设置墙壁判定。
-
同样地,将 TileMapLayer 作为子对象使用,通过 TileMapLayer 创建移动平台。
-
除了被埋没的情况外,其他功能均正常。当我将 AnimatableBody2D 添加到可移动的地板上,并将其现有的 CollisionShape2D 设置为子对象时,出现了在地板之外位置出现不可见碰撞体的异常行为,导致无法正常工作。
-
尝试将可移动的地板放置在 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 后可以降落,这可能是近期碰撞判定修复导致的回归错误。
我在本地测试时似乎已经成功落地,能否请您提供更详细的信息?



