C# 计算当前速度/玩家撞墙时停止跑步

C# 计算当前速度/玩家撞墙时停止跑步,c#,unity3d,box2d,C#,Unity3d,Box2d,背景: 我有一个2D平台,可以让玩家向左或向右运行(你猜对了)。我设置了许多不同的动画来模拟跑步、走路和跳跃等事件。它们都取决于玩家的刚体速度。如果它是0,那么简单地站着不动,如果它更大,那么运行,依此类推。我的问题是,每当玩家撞到墙时,速度仍然高于零(即使角色没有移动) 那么,我如何计算真实速度,或者在击中物体时阻止玩家奔跑呢?一个简单的方法是在每帧的开始和结束时检查玩家的位置。如果这个位置没有移动,那么他就没有移动 一个简单的方法是检查他在每帧开始和结束时的位置。如果这个位置没有移动,那么他

背景:

我有一个2D平台,可以让玩家向左或向右运行(你猜对了)。我设置了许多不同的动画来模拟跑步、走路和跳跃等事件。它们都取决于玩家的刚体速度。如果它是0,那么简单地站着不动,如果它更大,那么运行,依此类推。我的问题是,每当玩家撞到墙时,速度仍然高于零(即使角色没有移动)


那么,我如何计算真实速度,或者在击中物体时阻止玩家奔跑呢?

一个简单的方法是在每帧的开始和结束时检查玩家的位置。如果这个位置没有移动,那么他就没有移动

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

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

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

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

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


您可以使用ApplyForce或ApplyLinearImpulse移动玩家身体,然后GetLinearVelocity将返回真实速度,而不是只给您自己设置的相同值。

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

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


您可以使用ApplyForce或ApplyLinearImpulse移动玩家身体,然后GetLinearVelocity将返回真实速度,而不是只给您自己设置的相同值。

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

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


您可以使用ApplyForce或ApplyLinearImpulse移动玩家身体,然后GetLinearVelocity将返回真实速度,而不是只给您自己设置的相同值。

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

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


您可以使用ApplyForce或ApplyLinearPulse移动玩家身体,然后GetLinearVelocity将返回真实速度,而不是只给您自己设置的相同值。

您可以使用检测墙的碰撞事件。当对象命中任何对象时,将调用此函数。如果您标记了希望玩家停止的任何东西(例如墙),您可以检测特定碰撞并相应地进行操作:

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
,则您的对象很可能已经“停止”了,因为它不会再移动太多。速度
0
0.00000000 763168381
之间的差别非常小。因此,与其检查速度是否为零,不如检查速度是否真的很小。

您可以使用来检测与墙的碰撞事件。当对象命中任何对象时,将调用此函数。如果您标记了希望玩家停止的任何东西(例如墙),您可以检测特定碰撞并相应地进行操作:

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
,则您的对象很可能已经“停止”了,因为它不会再移动太多。速度
0
0.00000000 763168381
之间的差别非常小。因此,与其检查速度是否为零,不如检查速度是否真的很小。

您可以使用来检测与墙的碰撞事件。当对象命中任何对象时,将调用此函数。如果您标记了希望玩家停止的任何东西(例如墙),您可以检测特定碰撞并相应地进行操作:

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.vel