当前位置: 首页 > 知识库问答 >
问题:

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

孙成益
2023-03-14

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

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

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

游戏细节:在我的例子中,玩家正在通过程序生成的虫洞移动,虫洞由使用网格对撞机分割的对象组成。虫洞在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; }
    }
}

但在优雅地解决这个问题时,我完全不知所措。

目前,我只是缓存每帧播放器的速度。如果标记了碰撞,我将使用前一帧中缓存的速度覆盖生成的速度。这在大多数情况下都有效:玩家会不知不觉地在地板上鬼魂,形成一个框架,然后越过冒犯的关节。但在足够高的速度下,或者在与隧道内障碍物的相互作用下,玩家有可能被弹出地面,进入太空。我不想太多地限制玩家的速度,因为游戏的感觉部分依赖于高速和硬碰撞。

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

共有1个答案

石超
2023-03-14

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

这里鬼顶点解释得更详细:https://www.iforce2d.net/b2dtut/ghost-vertices

 类似资料:
  • 我已经寻找并找到了单个碰撞的答案,但我正在寻找一种检测多种类型的碰撞的方法。我正在制作一个游戏,其中有3个我想要的碰撞。用户飞机与敌方子弹相撞,用户子弹与敌机相撞(我已经工作过),敌方子弹与用户子弹相撞。我已经设置并更正了所有类别BitMask和contactTestBitMask。这是我的委托方法。

  • 我正在从Python速成班上攻克太空入侵者游戏。我正在使用Python 3.5和Pygame 1.9。2a0,groupcollide() 在原作中,当子弹与宇宙飞船碰撞时,两个精灵都会从屏幕上移除。 在我的版本中,我希望删除对我来说更随机,以便不是所有的点击都成功。我使用随机模块完成了这项工作,如果随机数低于某个阈值(n),则使碰撞成功。我已经在下面的代码中使用了这个函数,但是它没有按照我想要的

  • 我正在制作一个吃豆人风格的游戏,在pygame中使用蟒蛇。目前,我正在创造吃豆人必须在迷宫周围避免的幽灵/怪物。我已经创建了这些,并试图添加随机运动碰撞检测,以便它们在迷宫中移动,而不仅仅是整个屏幕。这些怪物的代码是波纹管。我的问题是,似乎有点跳来跳去,几乎一动不动,我怎么能像吃豆人幽灵一样顺利地穿过迷宫?任何帮助都非常感谢。

  • 我在PyGame中创建了两个简单的精灵,其中一个是雨伞,另一个是雨滴。雨滴被添加到一个名为< code>all_sprites的sprite组中。伞精灵有自己的组,名为< code>Umbrella_sprite 雨滴从屏幕顶部“落下”,如果其中一个碰到雨伞/与雨伞碰撞..雨滴应该被删除了。但是除了特定雨滴之外,所有其他雨滴都受此影响。

  • 我正在用python和pygame开发一个平台游戏。完整代码可以在“https://github . com/C-Kimber/FBLA _ Game”找到。我遇到的问题是玩家精灵和墙壁精灵之间的碰撞,特别是角落。当玩家按下x移动键并跳跃时,玩家要么不动,要么被卡住。以下是碰撞示例: 我尝试过其他方法,比如用速度来确定碰撞的因素,但这是迄今为止效果最好的方法。如果你能提供一个解决方案,我将不胜感激

  • 这就是正在发生的事情,游戏不断停止,因为两个圆圈相互碰撞,我正在尝试通过确保ID是正方形ID来防止这种情况,我试图让圆圈碰撞在一起,而忽略碰撞,但它没有这样做,我不知道如何确切地阻止它相互碰撞,只允许它与正方形碰撞。 基本上我想阻止这个圆与另一个圆碰撞,并允许它与正方形碰撞。 任何帮助都会很好谢谢 游戏引擎引擎类 这是我在扩展game.engine.engine包的game类中检查冲突的地方。 游