【问题标题】:Not sprint while crouching?蹲着不冲刺?
【发布时间】:2018-11-19 07:46:32
【问题描述】:

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

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

【问题讨论】:

  • && !crouching?

标签: c# if-statement unity3d


【解决方案1】:

在是否蹲下时将布尔变量设置为真/假。

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;
    }
}

只有在不使用蹲伏变量/按钮时才能激活短跑修饰符。

【讨论】:

  • 您的蹲伏代码不完整,因为您没有在任何地方设置它。必须对其进行编辑才能添加。
  • 别担心,我没有意识到我必须写出整个解决方案!我也想知道为什么 (!isCrouching...) 的双重声明比单个容器效果更好?
  • 您不必写出整个代码。只需显示重要部分,即何时何地写入 isCrouching 以及何时读取它。而已。 isCrouching 的双重声明没有好坏之分。它只是使代码非常接近原始代码的方式,并教操作员使用&&。为了避免过多的if 语句,您将不得不使用&& 来简化您的代码。您可以根据需要更改它。
【解决方案2】:

接受的答案实际上会在您的游戏中利用。玩家将按下冲刺(速度 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-26
    相关资源
    最近更新 更多