更改 C# Unity 函数内 if 语句的条件

Changing the conditions of an if statement inside a function for C# Unity

我正在清理一些代码,更多的是为了改进。我有一个按钮可以打开和关闭一些文本。它的工作原理是使用指针,单击按钮并淡出所有项目,单击的项目除外:

  public void OnHideClick()
{
    AllText.Remove(this.gameObject);
    if (newSwitchOne)
    {
        for (int i = 0; i < 3; i++)
        {
            switchOn = true;
        }
    }
    else if (newSwitchTwo)
    {
        for (int i = 0; i < 3; i++)
        {
            switchOff = true;
        }
    }
}

更新根据布尔值的真值运行操作并忽略假值。这很好用。

  void Update()
{
    if (switchOn)
    {
        for (int j = 0; j < 4; j++)
        {
            TextMesh TextColor = AllText[j].GetComponent<TextMesh>();
            TextColor.color = Color.Lerp(TextColor.color, new Color(255, 255, 255, 0), 0.0075f * Time.time);
            if (TextColor.color.a <= 0.023f)
            {
                TextColor.color = new Color(255, 255, 255, 0);
                if (TextColor.color.a == 0.0f)
                {
                    switchOn = false;
                    switchOff = false;
                    newSwitchOne = false;
                    newSwitchTwo = true;
                }
            }

        }
    }
    if (switchOff)
    {
        for (int j = 0; j < 4; j++)
        {
            TextMesh TextColor = AllText[j].GetComponent<TextMesh>();
            TextColor.color = Color.Lerp(TextColor.color, new Color(255, 255, 255, 1), 0.005f * Time.time);
            if (TextColor.color.a >= 0.977f)
            {
                TextColor.color = new Color(255, 255, 255, 1);
                if (TextColor.color.a == 1.0f)
                {
                    switchOn = false;
                    switchOff = false;
                    newSwitchOne = true;
                    newSwitchTwo = false;
                }
            }
        }
    }
}

我正在尝试清理这段代码。我非常了解函数和 CoRoutines,并且通过看到 if switchOn 和 if switchOff 的类似代码,我想知道我是否可以通过传递一些值作为参数来清理它。我试过这个,但似乎很难处理测试 color.alpha 值的 if 语句的条件,例如:

if (TextColor.color.a >= 0.977f)

我知道 sys.action 但这似乎并不奏效。据我所知,我相信将小于或大于符号“<”、“>”作为参数进行更改 帮助。我做了一些搜索 - 但没有找到太多可以帮助我的东西。也许看错了方向。

有人能帮我解释一下吗?

这行得通吗? 我已尝试确定代码的共性以尝试减少一些重复。

void Update()
{
    var color = switchOn ? new Color(255, 255, 255, 0) : new Color(255, 255, 255, 1);
    var multiplier = switchOn ? 0.0075f : 0.005f;

    for (int j = 0; j < 4; j++)
    {
        TextMesh TextColor = AllText[j].GetComponent<TextMesh>();
        TextColor.color = Color.Lerp(TextColor.color, color, multiplier * Time.time);
        if ((switchOn && TextColor.color.a <= 0.023f) || (!switchOn && TextColor.color.a >= 0.977f))
        {
            TextColor.color = color;
            if ()
            {
                switchOn = false;
                switchOff = false;
                newSwitchOne = !switchOn;
                newSwitchTwo = switchOn;
            }
        }

    }
}

当您想根据 condition/value 创建代码时,使用此表示法可以生成干净灵活的代码:

test ? value1 : value2

如果您不习惯这种表示法,请查看它的工作原理:测试条件,如果为真则使用值 1,否则使用值 2。

例如:

float testVal = 
if (TextColor.color.a == (switchOn ? 0.0f : 1.0f))
...

在上面的例子中,我假设你可以单独使用 switchOn(switchOn true > 你的 switchOn,switchOn false > 你的 switchOff)

public void OnHideClick()
{
  AllText.Remove(this.gameObject);
  if (newSwitchOne)
  {
      switchOn = true;
  }
  else if (newSwitchTwo)
  {
      switchOff = true;
  }
}

然后

void Update()
{
    if (switchOn || switchOff)
    {
        var alpha = switchOn ? 0 : 1;
        for (int j = 0; j < 4; j++)
        {
            TextMesh TextColor = AllText[j].GetComponent<TextMesh>();
            TextColor.color = Color.Lerp(TextColor.color, new Color(255, 255, 255, alpha), 0.0075f * Time.time);
            if ((TextColor.color.a <= 0.023f && switchOn) || (TextColor.color.a >= 0.977f && switchOff))
            {
                TextColor.color = new Color(255, 255, 255, alpha);
                switchOn = false;
                switchOff = false;
                newSwitchOne = switchOff;
                newSwitchTwo = switchOn;
            }
        }

    }
}

遗漏的其他答案是,有时 switchOn 和 switchOff 标志都变为假,在这种情况下我们不应该对 Update 做任何事情。

System.Action 不会做,因为它们 return 没有任何价值。但是 Func 会。

void MyMethodWithCondition(Func<bool>condition)
{
    if(condition == null){ return; } // or throw exception
    if(condition() == true)
    {
          // Do something
    }
}

下面是你如何使用它:

MyMethodWithCondition(()=>{ return  TextColor.color.a >= 0.977f; });
MyMethodWithCondition(()=>{ return  TextColor.color.a <= 0.977f; });

Func 也可以接受一个或多个参数:https://msdn.microsoft.com/en-us/library/bb549151(v=vs.110).aspx