蹲伏时不冲刺?

问题描述 投票:0回答:3

所以我正处于制作 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;
    }
}

不管怎样写,它们显然可以同时激活。但我想让蹲伏覆盖冲刺。因此,如果我同时使用冲刺和蹲伏,则只会激活蹲伏。 我尝试了多种方法,但没有任何效果,我确信我错过了一些非常明显的东西,我只是不知道是什么。

c# if-statement unity-game-engine
3个回答
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;
    }
}

只有在不使用蹲伏变量/按钮时,才能激活冲刺修改器。


0
投票

接受的答案实际上在您的游戏中造成了漏洞。玩家将按下冲刺(速度x2),按下蹲伏(速度/2),释放冲刺(什么也没有发生),然后释放蹲伏(速度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;
}

0
投票

不确定这是否是最好的解决方案,我只是一个初学者,但这对我有用,并且修复了我认为的漏洞。

public float movementSpeed;
public float baseSpeed;
public float sprintingSpeed;
public float crouchingSpeed;

void Start()
{
    baseSpeed = movementSpeed;
    sprintingSpeed = movementSpeed * 2;
    crouchingSpeed = movementSpeed / 2;
}

private voiud MyInput(){
    if (crouching == false)
    {
        if (Input.GetKeyDown(sprintKey))
        {
            movementSpeed = sprintingSpeed;
            sprinting = true;
        }
        if (Input.GetKeyUp(sprintKey))
        {
            movementSpeed = baseSpeed;
            sprinting = false;
        }
    }

    if (sprinting == false)
    {
        if (Input.GetKeyDown(crouchKey))
        {
            movementSpeed = crouchingSpeed;
            crouching = true;
        }
        if (Input.GetKeyUp(crouchKey))
        {
            movementSpeed = baseSpeed;
            crouching = false;
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.