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

时间:2017-08-24 11:39:18

标签: c# unity3d unity5

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

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

更新根据boolean为true运行操作,并忽略false版本。这很好。

  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和switchOff的类似代码我想知道我可以通过在参数中传递一些值来清理它。我试过这个并且似乎对测试color.alpha值的if语句的条件有困难,例如:

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

我知道sys.action但这似乎没有发挥作用。据我所知,我相信改变小于或大于符号'&lt;','&gt;'作为一个论点 救命。我做了一些搜索 - 但没有找到太多帮助我。也许看错了方向。

任何人都可以为我解释这个问题吗?

4 个答案:

答案 0 :(得分:3)

这会有用吗? 我试图确定代码的通用性,以尝试减少一些重复。

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

    }
}

答案 1 :(得分:2)

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标志都变​​为false,在这种情况下我们不应该对Update做任何事情。

答案 2 :(得分:2)

System.Action不会做,因为他们不会返回任何值。但是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

答案 3 :(得分:1)

如果您想根据条件/值创建代码,使用此表示法可以获得干净灵活的代码:

test ? value1 : value2

如果您不习惯这种表示法,请注意它是如何工作的:测试条件,如果为true,则使用value1,否则使用value2。

例如:

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

在上面的示例中,我假设您可以单独使用switchOn(switchOn true&gt;您的switchOn,switchOn false&gt;您的switchOff)