【问题标题】:Unity3D: Recalculating collisions after Physics2D.IgnoreLayerCollision()?Unity3D:在 Physics2D.IgnoreLayerCollision() 之后重新计算碰撞?
【发布时间】:2014-04-04 15:05:25
【问题描述】:

我的“玩家”游戏对象站在一个平台上。他按了一个组合键,我确认他站在正确的平台上,然后运行以下代码:

Physics2D.IgnoreLayerCollision(playerLayer, plataformLayer);

他的意图是从平台上掉下来。相反,什么都不会立即发生。玩家仍然在平台上并且可以四处走动——只有当他离开平台并试图回到平台上时,他才会从平台上掉下来。

所以我做了一个临时的丑陋解决方法:

Physics2D.IgnoreLayerCollision(playerLayer, plataformLayer);
rigidbody2D.AddForce(transform.up * jump / 1.5f);

这将迫使玩家跳跃,使 Unity “重新计算”碰撞,并且玩家将如我所愿地穿过平台。更奇怪的部分是:如果跳跃不够高(100 力在 1 质量和 0.5 重力尺度似乎是最小值),玩家仍然会降落在平台上,即使 Unity 应该忽略这些碰撞.

我还尝试用力和直接速度将玩家向下推,但没有运气 - 他仍然与平台发生碰撞,只是在远离平台一次后才停止与平台碰撞。

另外,我的播放器 Rigidbody2D 检测模式设置为 Continuous,我尝试以多种不同方式设置平台,有无 Rigidbody2D。

关于如何让玩家在碰撞开始被忽略时立即从平台上掉下来的任何想法?提前致谢。

【问题讨论】:

  • 过去,我通过更改平台的碰撞层(与玩家以外的所有其他物体发生碰撞)来管理跌落平台。跨度>

标签: unity3d collision-detection


【解决方案1】:

我遇到了完全相同的问题。我有一个替代解决方案,您可以根据自己的喜好找到。

与其禁用或移动要忽略的地形,不如暂时将玩家游戏对象的刚体 2D 设置为运动学。这不会让你像你想要的那样“掉线”通过平台 - 但它会让你通过简单地使用 transform.Translate(或 Vector3.Lerp,如果你愿意)来移动你的角色来创造你的错觉通过代码向下。 这将禁用 Rigidbody2D.AddForce,但仍允许通过 rigibdody2D.velocity 进行设置移动,如果这比直接操作变换更可取。

确保向下速度仅在您处于 Kinematic 状态时持续,并尝试使其与游戏的重力相匹配,并且看起来非常无缝。 如果您将刚体重新打开得太快,它(即使使用 ignoreLayers :/ )仍会跳回平台 - 但如果您将其打开太久,您可能会穿过多个预期的单向平台,或者甚至 :O 穿过舞台底部! 如果你能小心的话,这很容易避免 - 我个人使用 MonoBehaviour.Invoke 来设置一个非常短的时间限制,让玩家保持 Kinematic 多长时间(大约 0.5 秒),并且我在他们移动 0.5 个单位后立即禁用 Kinematic启动“hopDown”的点。 如果您的重力/平台/角色比例与我的大不相同,您可能需要尝试一些不同的数字。

这是我第一次尝试在 stackoverflow 上回答问题,希望对您有所帮助!

【讨论】:

    【解决方案2】:

    一个简单的方法是在调用之后

    Physics2D.IgnoreLayerCollision(playerLayer, plataformLayer);
    

    你重置了玩家的层:

    player.gameObject.layer = playerLayer;
    

    【讨论】:

      【解决方案3】:

      听起来您在来这里之前已经介绍了很多可能的解决方案,所以,干得好。我在下面列出了一些替代想法。我希望他们有所帮助。祝你好运!

      • 从平台本身移除碰撞对象。
      • 将碰撞对象偏移到某个远程位置,使其不会与玩家交互。偏移对象可能会导致碰撞对您提到的跳跃产生类似的反应。

      【讨论】:

      • 坦克!这种解决方案的问题在于,它还会使平台停止与其他游戏对象碰撞,并导致它们也摔倒。
      猜你喜欢
      • 2012-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多