如何使用相同的按钮进行不同的操作

时间:2018-01-10 12:49:57

标签: c# unity3d

好的,所以我正在构建一个有两种跳跃类型的平台游戏。 正常跳跃 - 在地面上,按空格键 空中跳跃 - 跳跃时,有限的额外跳跃(同时按空格键)

我已经找到了这个跳跃的主要机制,但我遇到了障碍。每次跳跃时,有限的空中跳跃开始为3。但是,根据我编写的代码,Unity使用最初的“正常跳转”作为三者之一。

以下是我的代码示例:

bool pressingJumpButton = Input.GetKeyDown("space");
    if (pressingJumpButton)
    {

        if (canJump)
        {
            jumping = true;
        }
    }       

if (jumping)
{

    if (pressingJumpButton && inAir == false) {
       Debug.Log("jump");
       GetComponent<Rigidbody>().velocity = new Vector3(
       GetComponent<Rigidbody>().velocity.x,
       jumpingSpeed,
       GetComponent<Rigidbody>().velocity.z);

       inAir = true;

     }
}
//airJump logic
if(inAir==true)
{
   airJump = true;

   if (airJump && maxAir>0 && pressingJumpButton)
   {
       Debug.Log("airJump");
       maxAir -= 1;
       GetComponent<Rigidbody>().velocity = new Vector3(
       GetComponent<Rigidbody>().velocity.x,
       jumpingSpeed,
       GetComponent<Rigidbody>().velocity.z);
   }
}

// on the floor
void OnTriggerStay (Collider otherCollider)
{
    if (otherCollider.tag =="JumpingArea")
    {

        canJump = true;
        jumping = false;
        inAir = false;
        maxAir = 3;
        airJump = false;

    }
}

我把debug.logs放进去,看看我是否能找到问题,当我第一次跳跃(从地面)时,它注册为正常和空中跳跃。

我认为通过使用inAir bool只能在按下跳转按钮后返回true,这将是修复但没有运气。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

您需要结合跳跃和空中测试并使用else子句。正如它的编写,你正在进行跳转,设置inAir = true,然后在测试之后inAir是否为真,这意味着你在每次正常跳跃后都会进行空中跳跃。

if (jumping && !inAir)
{
  Debug.Log("jump");
  ...
}
else if (inAir && jumping)
{
  Debug.Log("airJump");
  ...
}

由于您在设置pressingJumpButton时已经测试过,因此也无需重新检查jumping = true

一个(恕我直言)更好的版本,避免重复的代码,并摆脱不必要的变量:

if (pressingJumpButton && canJump)
{
    if (!inAir)
    {
        Debug.Log("jump");
        inAir = true;
        DoJump();
    }
    else if (maxAir > 0)
    {
        Debug.Log("airJump");
        maxAir--;
        DoJump();
    }

}
private void DoJump()
{
    GetComponent<Rigidbody>().velocity = 
        new Vector3(GetComponent<Rigidbody>().velocity.x, 
                    jumpingSpeed, 
                    GetComponent<Rigidbody>().velocity.z);
}