复杂的 If 条件。不好的做法?

Complex If conditions. Bad practice?

上下文: 我试图确保我的玩家只能在以下情况下冲刺:

  1. 他们正在前进,
  2. 按下"Sprint"键,
  3. 他们脚踏实地。
if ((Input.GetAxis("Vertical") == 1) && Input.GetButton("Sprint") && isGrounded)
        {
            isRunning = true;
            relativeMovementSpeed = playerSprintSpeed * Time.deltaTime;
        } 

这是否被认为是不好的做法或可读性差

如果是这样,哪种方法更好(标准化或更易于阅读)?

在一个 if 中评估多个事物并没有错。如果有的话,它比嵌套它们的替代方案更好。

但是,当此评估变得更大时,它可能变得不可读。您当前的示例(恕我直言)仍然可以,但是不同的人会在不同的地方画线。

当它变得太复杂而难以阅读时,您可以将评估抽象为小方法,例如:

private bool IsMovingForwards()
{
    return Input.GetAxis("Vertical") == 1;
}

private bool IsSprintKeyPressed()
{
    return Input.GetButton("Sprint");
}

这增强了 if 块的可读性:

if (IsMovingForwards() && IsSprintKeyPressed() && isGrounded)
{
    // ...
} 

这几乎完全重复了您对所需评估逻辑的描述。

编辑:只是要指出,您可以自由选择是使用局部变量、class 属性、帮助程序 class 还是抽象方法这些个人评价。我在这里使用了方法,但您可以根据您当前的上下文以多种方式进行处理。这里的主要目标是以易于阅读的方式标记逻辑。

我认为@Flater 方法很好。 我会稍微更改一下以使用属性:

private bool IsMovingForwards
{
    get { return Input.GetAxis("Vertical") == 1; }
}

private bool IsSprintKeyPressed
{
    get { return Input.GetButton("Sprint"); }
}

我会为 IsRunning 创建另一个:

private bool IsRunning
{
    get { return IsMovingForwards && IsSprintKeyPressed && isGrounded; }
}

所以您的代码现在如下所示:

if (IsRunning)
    relativeMovementSpeed = playerSprintSpeed * Time.deltaTime;