C# 不是蹲着冲刺吗?

C# 不是蹲着冲刺吗?,c#,if-statement,unity3d,C#,If Statement,Unity3d,因此,我正处于制作FPS游戏的早期阶段,我刚刚实现了sprint和crouch功能(此时crouch只会让玩家减速)。 其功能如下: private void sprintInput() { if (Input.GetKeyDown(sprintKey)) { movementSpeed *= 2f; } if (Input.GetKeyUp(sprintKey)) { movem

因此,我正处于制作FPS游戏的早期阶段,我刚刚实现了sprint和crouch功能(此时crouch只会让玩家减速)。 其功能如下:

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;
    }
}
不管这样写,它们显然可以同时被激活。但我想让克劳奇改写斯普林特。所以如果我同时使用冲刺和蹲姿,只有蹲姿被激活。
我尝试了多种方法,但都没有效果,我确信我遗漏了一些非常明显的东西,我只是不知道是什么。

在蹲下或不蹲下时,将布尔变量设置为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;
    }
}

sprint修饰符只有在蹲姿var/按钮未使用时才可用。

在蹲姿与否时,将布尔变量设置为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;
    }
}

只有当蹲姿/按钮未使用时,才能激活“疾跑”修改器。

接受的答案实际上在游戏中进行了利用。玩家将按sprint(速度x2),按crouch(速度/2),释放sprint(没有发生),然后释放crouch(速度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;
}

被接受的答案实际上在你的游戏中发挥了作用。玩家将按sprint(速度x2),按crouch(速度/2),释放sprint(没有发生),然后释放crouch(速度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;
}

&&!蹲着
&&!蹲下
?您的蹲下代码不完整,因为您没有在任何地方设置它。我必须编辑它才能添加。不用担心,我没有意识到我必须写出整个解决方案!我还想知道为什么(!isCrouching…)的双重声明要比单个容器更好,达到同样的效果?您不必写出整个代码。只需显示重要的部分,即何时何地向iscorching写入内容以及何时从中读取内容。就这样。双重声明的iscorching不是好的,也不是坏的。它只是让代码与原始代码非常接近,并教op使用
&&
。为了避免过多的
if
语句,您必须使用
&&
t来简化代码。如果你愿意,你可以改变它。不,这不是问题,我只是好奇而已!你的蹲姿代码不完整,因为你没有在任何地方设置它。我必须编辑它才能添加。不用担心,我没有意识到我必须写出整个解决方案!我还想知道为什么(!isCrouching…)的双重声明要比单个容器更好,达到同样的效果?您不必写出整个代码。只需显示重要的部分,即何时何地向iscorching写入内容以及何时从中读取内容。就这样。双重声明的iscorching不是好的,也不是坏的。它只是让代码与原始代码非常接近,并教op使用
&&
。为了避免过多的
if
语句,您必须使用
&&
t来简化代码。如果你愿意,你可以改变它。不,这不是问题,我只是好奇而已!