Unity3D:在Physics2D.IgnoreLayerCollision()之后重新计算碰撞?

时间:2014-03-03 14:10:33

标签: unity3d collision-detection

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

Physics2D.IgnoreLayerCollision(playerLayer, plataformLayer);

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

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

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

这将迫使玩家跳跃,使Unity“重新计算”碰撞,玩家将按照我的意愿通过平台。更奇怪的部分是:如果跳跃不够高(100个力量,1个质量,0.5重力等级似乎是最小的),玩家仍然会降落在平台上,即使Unity应该忽略那些碰撞

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

此外,我的播放器Rigidbody2D检测模式设置为连续,我尝试以多种方式设置平台,无论是否有Rigidbody2D。

一旦碰撞开始被忽略,有关如何让玩家立即从平台上掉下来的任何想法?提前谢谢。

3 个答案:

答案 0 :(得分:1)

我一直有同样的问题。我有一个您可以根据自己的喜好找到的替代解决方案。

暂时将玩家gameObject的rigidbody2D设置为运动学,而不是禁用或移动要忽略的地形。这不会导致你掉线'通过你想要的平台 - 但它将允许你通过简单地使用transform.Translate(或Vector3.Lerp,如果你喜欢)通过代码移动你的角色来创建你的幻觉。   这将禁用Rigidbody2D.AddForce,但仍然允许通过rigibdody2D.velocity设置移动,如果这比直接操作变换更好。

确保向下速度仅在您使用Kinematic时持续,并尝试让它与游戏的重力相匹配,并且看起来非常无缝。   如果你把刚体重新打开太快,它可以(甚至使用ignoreLayers:/)跳回到平台 - 但是如果你把它留下太久,你可以通过多个预定的单向平台,或者甚至:O穿过舞台的底部!   如果你可以小心,这很容易避免 - 我个人使用MonoBehaviour.Invoke来设置一个非常短的时间限制玩家保持运动学的时间(约0.5秒),并且我一旦他们移动0.5单位就禁用了Kinematic ' hopDown'发起了。   如果你的引力/平台/角色尺度与我自己的比例大不相同,你可能需要尝试一些不同的数字。

这是我第一次尝试stackoverflow的答案,所以我希望它有所帮助!

答案 1 :(得分:1)

一种简单的方法是在调用

之后
Physics2D.IgnoreLayerCollision(playerLayer, plataformLayer);

您重置了播放器的图层:

player.gameObject.layer = playerLayer;

答案 2 :(得分:0)

听起来你在来这里之前已经涵盖了很多可能解决这个问题的方法,所以那里工作很好。我在下面列出了一些替代想法。我希望他们有所帮助。祝你好运!

  • 从平台本身移除碰撞对象。
  • 将碰撞对象偏移到某个远程位置,这样它就不会与播放器交互。偏移物体可能会导致碰撞对您提到的跳跃产生类似的反应。