背景
我有一个2D平台游戏,让玩家可以向左或向右跑(你猜对了)。我有许多不同的动画设置来模拟跑步,走路和跳跃等事件。它们都依赖于玩家的Rigidbody2D Velocity。如果它是0然后只是静止不动,如果它更大,那么运行,依此类推。我的问题是,每当玩家进入墙壁时,速度仍然高于零(即使角色没有移动)
那么如何在击中物体时计算真实速度或阻止玩家跑步?
答案 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
,则您的对象很可能已停止"从某种意义上说,他已经不再感动了。 0
和0.00000000763168381
的速度差异很小。因此,不要检查零速度,而是检查真正非常小的速度。