2017-08-24 66 views
-1

我正在清理一些代码,更多的是改进的动机。我有一个按钮可以打开和关闭一些文本。它的工作原理是使用指针,点击一个按钮,淡出的所有项目,除了一个点:更改C#Unity中函数内if语句的条件

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,并且通过查看类似的代码来判断switchOn,如果switchOff我想知道是否可以通过传递一些值作为参数来清除它。我曾尝试这样做,似乎都与测试color.alpha的值,例如if语句的条件难度:

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

我知道sys.action,但这似乎并没有发挥球。据我所知告诉我相信改变小于或大于符号'<','>'作为参数 帮助。我做了一些搜索 - 但没有找到太多的帮助我。也许看着错误的方向。

任何人都可以为我阐明这一点吗?

回答

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

+0

谢谢Everts--这正是我所追求的,并且有了一些修补,它帮助我学到了更多东西。我很感谢所有有帮助的评论 - 我相信每个人都会以某种方式帮助我,以进一步了解未来的发展。 –

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

    } 
} 
+0

或者只是做'如果(合闸合闸TextColor.color.a <= 0.023f:(TextColor.color.a> = 0.977f))' –

+0

好主意@JakubDæbek! – mjwills

1

当你想创建一个不同条件/值的代码,使用这个符号可能会导致清洁和灵活的代码:如果你不习惯这种符号

test ? value1 : value2 

,在这里它是如何工作的:测试条件,如果true使用value1,否则使用value2。

例如:

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

在上面的例子中,我假设你可以单独使用合闸合闸(合闸合闸真>您合闸合闸,合闸合闸假>您关机)

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标志变成了fals在这种情况下,我们不应该对Update进行任何操作。