2016-07-22 35 views
0

時,Else語句仍然有效我不太確定爲什麼,但是我無法讓這個腳本自動運行。我有一個if語句,後面跟着一個else語句,嵌套在另一個if語句和它自己的else語句中,並且由於腳本的方式,else語句會觸發,無論我做什麼。我嘗試退出該功能,但它不起作用。我在下面有兩個版本的腳本,一個版本使用switch語句,一個版本使用if/else語句。他們在一系列相同的功能。即使當If被告知返回

我想要的是,如果cost + memorybar.Value大於100,它告訴用戶,並關閉切換,然後退出該函數。現在發生的事情是,它將關閉開關,然後運行else語句,即使在switch語句中也是如此。現在切換以某種方式反向進行。我見過類似的問題,但即使是返回聲明也無法解決這個問題。

cost = 50; 
    switch (power5.isOn) { 
    case true: 
     if (cost + memorybar.value > 100) { 
      error.text = "Exeeds maximum memory"; 
      power5.isOn = false; 
      break; 
     } else { 
      memorybar.value = memorybar.value + cost; 
      break; 
     } 
    case false: 
     memorybar.value = memorybar.value + cost; 
     break; 
    } 



    if (power5.isOn == true) { 
     if (cost + memorybar.value > 100) { 
      error.text = "Exeeds maximum memory"; 
      power5.isOn = false; 
      return; 
     } else 
      memorybar.value = memorybar.value + cost; 
     return; 
    } 
    else 
     memorybar.value = memorybar.value - cost; 
+2

布爾值上的'switch'有點矯枉過正。將自己的麻煩保存下來,並將其轉換爲'if(power5.isOn){} else {}'語句。另外,我不知道在switch語句的代碼內部修改'switch'裏面的變量時會產生什麼樣的影響。 –

+2

如果我是你,我會做的第一件事就是放置'if-else'的括號,即使它包含一個語句。 – VSG24

+0

這些函數如何被調用?也許改變布爾值會觸發你的函數再次運行。在代碼行中加上'switch'或者最外面的'if'語句來放置一個斷點,看看整個事情是否被調用了兩次。 –

回答

1

你的交換機觸發上power5.isOn,並將其設置爲false將導致第二開關情況也評價爲真。使用標準的if語句來實現它,它將起作用。

cost = 50; 
if (power5.isOn) 
{ 
    if (cost + memorybar.value > 100) 
    { 
     error.text = "Exeeds maximum memory"; 
     power5.isOn = false; 
    } 
    else 
    { 
     memorybar.value = memorybar.value + cost; 

    } 
} 
else 
{ 
    memorybar.value = memorybar.value + cost; 
} 
+0

我認爲這些是兩個單獨的示例,第二個示例是OP重新實現'switch'語句作爲標準的'if/else'。 –

+0

不,不起作用。我先試了一下。 – MechaScoots

+0

我不認爲'switch'在c#中以這種方式工作。如果選擇了一個案例,即使您更改開啓的變量,也不會陷入其他案例。請參閱以下小提琴https://dotnetfiddle.net/0xuahj。根據你的理論,它應該打印「1」和「2」,但它只打印「1」 – derpirscher

1

不需要return語句,請使用此代碼。

if (power5.isOn) 
{ 
    if (cost + memorybar.value > 100) 
    { 
      error.text = "Exeeds maximum memory"; 
      power5.isOn = false; 
    } 
    else 
    { 
      memorybar.value = memorybar.value + cost; 
    } 
} 
else 
{ 
     memorybar.value = memorybar.value - cost; 
} 
+0

「return」語句是不必要的,但不是有害的。你的代碼將完成OP的'if/else'塊。 –

+0

請注意'if(power5.isOn == true)'是多餘的。一個布爾表達式的計算結果是否與僅評估表達式相同。你可以說'if(power5.isOn)'。你做的沒有錯,但它更羅嗦。 –

+0

@RobertColumbia我同意你,刪除不必要的代碼。 –

0

對於第一個例子

switch (power5.isOn) { 
case true: 
    if (cost + memorybar.value > 100) { 
     error.text = "Exeeds maximum memory"; 
     power5.isOn = false; 
     break; 
    } else { 
     memorybar.value = memorybar.value + cost; 
     break; 
    } 
case false: 
    memorybar.value = memorybar.value + cost; 
    break; 
} 

我曾嘗試和失敗,重現您的問題如下:

bool powered = true; 
int cost = 50; 
int memorybar = 96; 
switch (powered) 
{ 
    case true: 
     if (cost + memorybar > 100) 
     { 
      Console.WriteLine("entered A"); 
      powered = false; 
      break; 
     } 
     else 
     { 
      Console.WriteLine("entered B"); 
      memorybar = memorybar + cost; 
      break; 
     } 
    case false: 
     Console.WriteLine("entered C"); 
     memorybar = memorybar + cost; 
     break; 
} 
Console.ReadLine(); 

這種打印 「進入」,別無其他。

除非您可以創建一個自包含的示例,否則您似乎更可能將自己與程序中的其他邏輯混淆在一起。是否有可能實際上調用了這段代碼兩次,那是你的問題?在輸入開關並查看它是否打印兩次之前,請確保不會出現Debug.Log消息。

沒有一個可重複的例子,我不能提供比這更多的幫助。

+0

我按照你的建議做了,它叫A和C.其實,它叫C然後是A. – MechaScoots

0

通過你所描述的,你似乎在Update()或其他連續調用中運行這個代碼,發生的事情是,一旦關閉電源,代碼仍然在每個週期被稱爲廣告。

你應該做的是有另一個標誌說明這個代碼是否應該被調用。

例如

OnTriggerEnter(Collider other) { 
    if (other.Tag == "powerTrigger") { 
     updatePower = true; 
    } 
} 

Update(){ 
    if(updatePower){ 
     if (power5.isOn){ 
      if (cost + memorybar.value > 100){ 
       error.text = "Exeeds maximum memory"; 
       power5.isOn = false; 
      } else{ 
       memorybar.value = memorybar.value + cost; 
      } 
     } else{ 
      memorybar.value = memorybar.value - cost; 
      if(memorybar.cost <= 0){ 
       memomrybar.cost = 0; 
       updatePower = false; 
      } 
     } 
    } 
} 
+0

我不是,我有一個切換,當切換點擊時,這個腳本運行。這是一個孤立的功能。 – MechaScoots

+0

你能告訴你使用哪個事件來調用它嗎?如果它是OnMouseDown(),請嘗試使用MouseUp()。 –

+0

也不是,它是觸發它的畫布對象。這是'OnValueChanged' – MechaScoots

相關問題