2017-08-24 102 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進行任何操作。