我的“玩家”游戏对象站在一个平台上。他按下一组键,我确认他站在正确的平台上,然后运行这段代码:
Physics2D.IgnoreLayerCollision(playerLayer, plataformLayer);
意图是他从平台上掉下来。相反,什么都不会立即发生玩家仍然在平台上并且可以四处移动 - 只有当他离开它并试图回到它时,只有在那个时候他才会从它下降。
所以我做了一个暂时的丑陋的解决方法:
Physics2D.IgnoreLayerCollision(playerLayer, plataformLayer);
rigidbody2D.AddForce(transform.up * jump / 1.5f);
这将迫使玩家跳跃,使Unity“重新计算”碰撞,玩家将按照我的意愿通过平台。更奇怪的部分是:如果跳跃不够高(100个力量,1个质量,0.5重力等级似乎是最小的),玩家仍然会降落在平台上,即使Unity应该忽略那些碰撞
我也尝试用力和直接速度向下推动玩家,但没有运气 - 他仍然与平台发生碰撞,他只是在离开它之后才停止与它碰撞。
此外,我的播放器Rigidbody2D检测模式设置为连续,我尝试以多种方式设置平台,无论是否有Rigidbody2D。
一旦碰撞开始被忽略,有关如何让玩家立即从平台上掉下来的任何想法?提前谢谢。
答案 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)
听起来你在来这里之前已经涵盖了很多可能解决这个问题的方法,所以那里工作很好。我在下面列出了一些替代想法。我希望他们有所帮助。祝你好运!