微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在由多个对撞机组成的飞机上修复幽灵碰撞?

如何解决在由多个对撞机组成的飞机上修复幽灵碰撞?

基本问题:当玩家在由多个对撞机组成的平面上移动时,Unity 的物理引擎会产生奇怪的碰撞。鬼碰撞发生在Colliders之间的关节处,表现为两种行为:

The player is moving left to right when the collision occurs

根据 Bennett Foddy 的演讲,这似乎是一般物理引擎的问题:

https://www.youtube.com/watch?v=NwPIoVW65pE&ab_channel=GDC

游戏细节: 就我而言,玩家正在通过程序生成的虫洞移动,该虫洞由使用 MeshCollider 的 Segment 对象组成。虫洞在 3D 空间中随机扭曲,而宽度和高度则动态变化。玩家可以在隧道内部360度扫射(重力方向与位置有关)。

这使得我发现的更简单的解决方案不切实际。其中包括

  1. 使用单个对象而不是多个对象
  2. 在关节后面放置多余的碰撞器

我已经设法在 OnCollisionEnter() 中标记了这些错误的碰撞。 PlayerController 上的这个方法可以很好地识别这些错误的碰撞,并引发一个标志。

private void OnCollisionEnter(Collision other)
{
    if (other.gameObject.tag != "Tunnel"){return;}

    // Bit mask for tunnel layer.
    int tunnelLayerMask = 1 << 10;

    // Get the direction from the nearest Segment's origin to the collision point.
    Vector3 toCollision = other.contacts[0].point - nearestSegment.transform.position;
 
    if (Physics.Raycast(nearestSegment.transform.position,toCollision,out RaycastHit hit,100f,tunnelLayerMask))
    {
        // Flag the collision if the detected surface normal 
        // isn't equal to the collision normal.
        if (other.contacts[0].normal != hit.normal) { colFidelityFlag = true; }
    }
}

但是当谈到优雅地解决问题时,我完全不知所措。

目前,我只是在每帧缓存玩家的速度。如果标记了碰撞,我会用前一帧的缓存速度覆盖结果速度。这适用于大多数情况:玩家在不知不觉中潜入地板一帧,然后越过违规关节。 但是在足够高的速度或与隧道内障碍物的相互作用下,玩家有可能被弹射穿过地板并进入太空。我不想过多限制玩家的速度,因为游戏的感觉部分依赖于高速和硬碰撞。

有人知道解决这些错误碰撞的更好方法吗?

解决方法

这被称为“幽灵顶点”,如果您有 2 个盒子碰撞器(或类似的东西)并且它们相互连接,就会发生这种情况。您可以尝试加入对撞机,以便您拥有一个单独的对撞机,而不是 2 个独立的连接的对撞机。

这里更详细地解释了幽灵顶点:https://www.iforce2d.net/b2dtut/ghost-vertices

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。