【问题标题】:How to use same button for different actions如何将相同的按钮用于不同的操作
【发布时间】:2018-01-10 22:11:41
【问题描述】:

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

我已经制定了这次跳跃的主要机制,但我遇到了障碍。每次跳跃时,有限的空中跳跃次数从 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 放入以查看是否可以找到问题,并且当我进行第一次跳跃(从地面)时,它会同时注册为正常跳跃和空中跳跃。

我认为只有在按下跳转按钮一次后才返回 true 的 inAir 布尔值将是解决方法,但没有运气。

我做错了什么?

【问题讨论】:

  • 如何更改pressingJumpButton 的值?
  • “在我编写的代码中,Unity 使用初始的“正常跳转”作为三个之一“ - 如果这确实是原因,那么为什么不将 maxAir 更改为 @ 987654324@ 并将其增加到 4?这将节省您实施逻辑以解决您是否在第一次跳跃。
  • 嗨 Ant,我想过这个问题,但是 airJump 变量将在游戏中升级,我认为如果我不将它分开,以后可能会给我带来更多问题。跨度>
  • 我已将我的 pressJumpButton 代码添加到 OP
  • 如果我理解正确,当你按空格键时,布尔值就会变为真。你在地上,所以你得到了“跳跃”日志。但现在你在空中,但 bool 仍然是真的。所以你会得到“airJump”日志。

标签: c# unity3d


【解决方案1】:

您需要结合跳跃和空中测试,并使用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);
}

【讨论】:

  • 轰隆隆!科林!你是男人。我也对自己有点恼火,现在看来很明显。谢谢
  • 当我面临调试一组行为不符合预期的逻辑时,我经常会退回到在纸上绘制老式流程图。它消除了所有杂乱无章的无关代码文本,并准确显示了事情的流程。我还做了一个小修改——在 else 中缺少一个测试。
  • 是的,流程图很有意义。我会用你的智慧,上师。我设法通过在我的代码中添加 else 来让它工作,但我想尽可能地简化,所以我会使用你的代码,看看它是否适合我。
  • 我在第一个 if 语句中添加了 (&& maxAir>0),否则它允许无限跳转,但除此之外它工作得很好。再次感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-13
  • 2016-03-18
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 2021-03-02
相关资源
最近更新 更多