2 回答
TA贡献1883条经验 获得超3个赞
我通常做的是检查我是向上还是向下。如果我向下走,我只接受地面检查。
void OnCollisionEnter(Collision other)
{
if (other.gameObject.name == "Ground" && rb.velocity.y < 0)
{
canJump = true;
}
}
但是,您使用getKeyDOWN所以这与保持空间等无关。
所以我可以推荐的下一件事是:在跳跃之前将velocity.y 设置为0。
if (Input.GetKeyDown("space"))
{
Vector3 vel = rb.velocity;
vel.y = 0;
rb.velocity = vel;
rb.AddForce(0, 10, 0, ForceMode.VelocityChange);
// ...
}
编辑:等等,我的第一个想法是“他使用 getKey 并持有空间”,我的第二个想法是:“他错过了 Time.deltaTime”。但现在我看到了:
您Input.Get...在 FixedUpdate 中使用过!
让我解释:
在Update调用所有s之前评估所有输入。 正如您在执行顺序中看到的,输入事件在更新之前被处理。
现在,根据您的帧速率,与(几乎)恒定的 FixedUpdate 相比,Update 会经常或很少被调用。
所以 FixedUpdate 可以在Update调用之间多次调用。这意味着输入事件运行一次。
所以我必须假设Input.GetKeyDown(Key.SPACE)在多个 FixedUpdates 中这将是正确的!
轻松修复:
bool jump_pressed = false;
void Update()
{
if(Input.GetKeyDown("space"))
{
jump_pressed = true;
}
if(Input.GetKeyUp("space"))
{
jump_pressed = false;
}
}
void FixedUpdate()
{
if(jump_pressed)
{
jump_pressed = false;
rb.AddForce(0, 10, 0, ForceMode.VelocityChange);
// etc...
}
}
因此,您只需在 Update 中处理所有 Input 逻辑,并在固定更新中执行其余部分。
当然,在 FixedUpdate 中 jump_pressed 需要设置为 false,因为否则它会在多个 FixedUpdates 中保持 true。
edit2:我又看了你的代码。无论你做什么,无论是在 FixedUpdate 还是 Update 中,都不要使用Time.deltaTimein AddForce.
AddForce 将操纵速度。并且在每个 PhysicsUpdate 中都使用速度来移动变换。但是 PhysicsUpdate/FixedUpdate 尝试以(几乎)固定的速率运行,而 Time.deltaTime 为您提供最后一个(更新)帧的经过时间。
如果您自己移动变换 ( position +=...) - 使用 Time.deltaTime。但是在使用 AddForce 时不要使用它。
- 2 回答
- 0 关注
- 398 浏览
添加回答
举报