unity-game-engine - Unity3D : Recalculating collisions after Physics2D. IgnoreLayerCollision()?

标签 unity-game-engine 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。

有什么想法可以让玩家在碰撞开始被忽略时立即从平台上掉下来吗?提前致谢。

最佳答案

我也遇到了完全相同的问题。我有一个替代解决方案,您可能会发现您喜欢的。

不要禁用或移动要忽略的地形,而是暂时将玩家游戏对象的rigidbody2D 设置为运动学。这不会导致您按照自己的意愿“下降”通过平台 - 但它可以让您通过简单地使用transform.Translate(或Vector3.Lerp,如果您愿意)来移动您的角色,从而创造出您所在的幻觉通过代码下来。 这将禁用 Rigidbody2D.AddForce,但仍允许通过 rigibdody2D.velocity 进行设置移动(如果这比直接操作变换更可取)。

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

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

关于unity-game-engine - Unity3D : Recalculating collisions after Physics2D. IgnoreLayerCollision()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22148925/

相关文章:

javascript - JS 贪吃蛇游戏中的碰撞检测错误

javascript - ECMAScript6 类中的碰撞函数

c# - 为什么我的 Unity3D Sprite 在 iPhone 上渲染时看起来像素化?

unity-game-engine - Unity 4.3.4f1 和 Xcode 5.1

unity-game-engine - 了解相机,使其适合 480x800

C# Unity 下拉菜单,在更改调用函数时,函数查询列表返回匹配的列表项

math - 如何计算包围其他边界球体的最小边界球体

ios - 如何使ios键盘返回键统一提交输入?

java - 简单的 Java 碰撞检测

c# - XAML 碰撞检测