2016-09-06 46 views
2

我已经遵循了“Roll-A-Ball”的Unity教程,并添加了一些扩展。球现在可以跳起来,但是每次跳起都会跳得太多次;当我按下SPACE时,我只想要一次球。现在我可以在SPACE上按3次,它会越来越高。如何解决双跳

if (Input.GetKeyDown(KeyCode.Space)) 
     { 
      Vector3 jump = new Vector3(0.0f, 150.0f, 0.0f); 

      rb.AddForce(jump); 
     } 

编辑:

试图改变的代码一点点,但现在我只能跳一次(第一次)

private void textBox_KeyDown(object sender, KeyEventArgs e) 
{ 
     if (Input.GetKeyDown(KeyCode.Space) && jump.y <= 0.0f) 
    { 
     jump.Set(0.0f, 150f, 0.0f); 
     rb.AddForce(jump); 

    } 
    } 
+0

你会得到这个结果,因为每当你按下空间时你都会给球增加额外的力量。 3按== 3 *方向的力量。监测球的向上速度,只有在满足特定参数时才加力。即如果向上速度<= 0,那么你可以跳!别的,你不能。 – Zze

+0

试图做到这一点,但它不起作用:( –

+0

@adadudu奇怪的是,一旦Z速度在空中遇到'0.0f',这意味着在轨迹中间 - 也就是说,除非我错了,我对UnityScript一无所知。只要按下空格键就可以尝试记录速度,以确保您没有丢失任何东西:^) – Gustavo6046

回答

0

我找到了解决方案。解决方法是添加OnCollisionEnter,您可以在其中处理玩家与地面碰撞时会发生的情况。此外,我还添加了一个计数器,当玩家跳跃时将其设置为0,当他与地面碰撞时再次设置为0。

计数器:

if (Input.GetKeyDown(KeyCode.Space)) 
    { 
     if (JumpCount < 1) 
     { 
      Vector3 jump = new Vector3(0.0f, 250.0f, 0.0f); 
      rb.AddForce(jump); 
      JumpCount++; 
     } 
    } 

计数器设置为0浏览:

void OnCollisionEnter(Collision other) 
{ 
    JumpCount = 0; 
} 
4

这能有点难以遵循(因为它不是一步一步的教程,而是一个方案)。

您必须检查球何时到达楼层,检查在第一次按下后速度是否为0或更高。一旦它确实,然后设置一些布尔(这里命名为CanJump)到true(或任何你的语言定义为真)。

还有一些更多的检查工作;一旦CanJump被设置为true(因为你的速度现在为>= 0),请将一个名为NumJumps的int变量也设置为0。通过这种方式,您可以在两次跳跃后将CanJump设置为假,以防止球跳跃。

请注意我对Unity 3D一无所知,但我有一些3D游戏(如虚幻引擎1,因此UT99改装)的经验。

+0

这是一个很好的答案,可以与Unity一起使用。你可以做的另一个检查是'onCollisionEnter'与'floor',将canJump设置为true,然后'onCollisionrExit'' canJump'将变为false。 – Zze

0

我发现,最好的解决办法是使用光线投射。

bool isOnGround = Physics.Raycast(transform.position, -Vector3.up, 1.875f); 

将1.875f替换为角色起源与地面之间的距离,再加上一点额外。然后,您可以在确定是否应该跳转时检查isOnGround