蹲下时不冲刺吗?

时间:2018-11-18 18:43:37

标签: c# if-statement unity3d

因此,我正处于制作FPS游戏的初期阶段,并且我刚刚实现了冲刺和蹲伏功能(蹲下此刻只会减慢玩家的速度)。 函数就是这样:

private void sprintInput()
{

    if (Input.GetKeyDown(sprintKey))
    {           
        movementSpeed *= 2f;
    }
    if (Input.GetKeyUp(sprintKey))
    {          
        movementSpeed /= 2f;
    }
}


private void crouchInput()
{
    if (Input.GetKeyDown(crouchKey))
    {           
        movementSpeed /= 2f;
    }
    if (Input.GetKeyUp(crouchKey))
    {
        movementSpeed *= 2f;
    }
}

尽管这样写,但显然可以同时激活它们。但我要蹲伏以覆盖sprint。因此,如果我同时使用sprint和蹲伏,则只会激活蹲伏。 我已经尝试了多种方法,但是没有任何效果,我确定我缺少明显的东西,我只是不知道。

2 个答案:

答案 0 :(得分:2)

无论是否蹲伏,将布尔变量设置为true / false。

bool isCrouching;

private void crouchInput()
{
    if (Input.GetKeyDown(crouchKey))
    {        
        isCrouching = true;   
        movementSpeed /= 2f;
    }
    if (Input.GetKeyUp(crouchKey))
    {
        isCrouching = false; 
        movementSpeed *= 2f;
    }
}

然后,您可以使用该变量来确保在冲刺之前不会蹲伏:

private void sprintInput()
{
    if (!isCrouching  && Input.GetKeyDown(sprintKey))
    {           
        movementSpeed *= 2f;
    }
    if (!isCrouching && Input.GetKeyUp(sprintKey))
    {          
        movementSpeed /= 2f;
    }
}

仅当不使用蹲伏式var / button时,才可以激活sprinting修饰符。

答案 1 :(得分:0)

被接受的答案实际上在您的游戏中发挥了作用。玩家将按下sprint(速度x2),按下蹲伏(速度/ 2),释放sprint(什么都没有发生),然后释放蹲伏(速度x2),这将使他的速度永久加倍。

我认为更正确的方法将存储两个标志:

bool isCrouching, isSprinting;
float baseSpeed, movementSpeed;

private void sprintInput {
    if (Input.GetKeyDown(sprintKey)) {        
        isSprinting = true;
        UpdateSpeed ();
    }
    if (Input.GetKeyUp(sprintKey)) {
        isSprinting = false; 
        UpdateSpeed ();
    }
}

private void crouchInput {
    if (Input.GetKeyDown(crouchKey)) {        
        isCrouching = true;
        UpdateSpeed ();
    }
    if (Input.GetKeyUp(crouchKey)) {
        isCrouching = false; 
        UpdateSpeed ();
    }
}

private void UpdateSpeed () {
    movementSpeed = isCrouching ? baseSpeed / 2
                  : isSprinting ? baseSpeed * 2
                  :               baseSpeed;
}