当玩家撞墙时计算当前速度/停止运行

时间:2014-09-16 17:43:25

标签: c# unity3d box2d

背景

我有一个2D平台游戏,让玩家可以向左或向右跑(你猜对了)。我有许多不同的动画设置来模拟跑步,走路和跳跃等事件。它们都依赖于玩家的Rigidbody2D Velocity。如果它是0然后只是静止不动,如果它更大,那么运行,依此类推。我的问题是,每当玩家进入墙壁时,速度仍然高于零(即使角色没有移动)

那么如何在击中物体时计算真实速度或阻止玩家跑步?

3 个答案:

答案 0 :(得分:1)

一种简单的方法是检查每个帧开始和结束时的位置。如果该位置没有移动那么他就不会移动。

答案 1 :(得分:1)

我假设您正在使用GetLinearVelocity来检查玩家身体的速度。我还假设你正在使用SetLinearVelocity来让玩家移动(这是你最终得到GetLinearVelocity返回的非零值而身体实际上没有移动的唯一方法。)

如果是这种情况,那么您只需设置一个值并再次读回。简单的解决方案是,不要这样做:)

你可以使用ApplyForce或ApplyLinearImpulse来移动玩家身体,然后GetLinearVelocity将返回真正的速度,而不是仅仅给你自己设定的相同值。

答案 2 :(得分:1)

您可以使用OnCollisionEnter2D检测墙的碰撞事件。当您的对象遇到任何东西时,将调用此函数。如果你标记了你希望玩家停在那里的任何东西(例如,Wall),你可以检测特定的碰撞并相应地表现:

void OnCollisionEnter2D(Collision2D collision) {
    if(collision.gameObject.tag="Wall") {
        //your player has just hit the wall. congratulations!
        //don't set velocity to zero here, because then he'll just stop in midair or something!
    }
}

我过去注意到的一件事是,如果没有强大的摩擦力影响你的玩家,他们的速度将保持微不足道的速度,但暂时仍然是非零值。为了补偿,你可以确定一个"停止"阈。例如,如果rigidbody2D.velocity.magnitude低于0.0001,则您的对象很可能已停止"从某种意义上说,他已经不再感动了。 00.00000000763168381的速度差异很小。因此,不要检查零速度,而是检查真正非常小的速度。