2017-09-05 94 views
0

在試圖創建一個遊戲我創建團結我曾經遇到過一個奇怪的問題的基礎OnCollisionEnter打破,當else語句添加

此代碼工作得很好(materialstate被設置爲0啓動())和對象本身的確,只要我添加它只是打破一個else語句改變材料

void OnCollisionEnter(Collision col){ 
    if (col.gameObject.name == "Player" && Materialstate == 0) { 
     renderComp.material = goal; 
     Materialstate = 1; 
    } 
} 

然而,衝突發生(我知道,因爲我已經在Materialstate print語句檢查它更新())但這次甚至不是最初的碰撞(這是工作正常els之前e增加了)作品:

void OnCollisionEnter(Collision col){ 
    if (col.gameObject.name == "Player" && Materialstate == 0) { 
     renderComp.material = goal; 
     Materialstate = 1; 
    } else { 
     if (col.gameObject.name == "Player") { 
      renderComp.material = starting; 
      Materialstate = 0; 
     } 
    } 
} 
+0

您可以請嘗試在IF語句的每一層添加一些調試消息。 'Debug.Log(「Message 1」);' –

+0

@JackLeahy嗯謝謝你的提示,似乎所有3層都在每次碰撞發生時執行(一個飛機上的球bou))關於如何解決這個問題的任何想法 – haseo98

回答

1

你可以試試這個代碼嗎?

void OnCollisionEnter(Collision col) { 
    if (col.gameObject.name == "Player") { 
     if (Materialstate == 0) { 
      renderComp.material = goal; 
      Materialstate = 1; 
      return; 
     } 
     renderComp.material = starting; 
     Materialstate = 0; 
    } 
} 

這刪除了其他基本檢查是否col.GameObject.name == "Player"兩次。這實際上可能會加快您的遊戲代碼,並且刪除額外的檢查。它也可以在原始狀態下正確執行所需的操作(col.GameObject.name == "Player"true)。

這是寫在假設Materialstate只會01,但是,如果你計劃有更多的國家,一個switch語句可能是使這項工作按照預期你最好的選擇。

void OnCollisionEnter(Collision col) { 
    if (col.gameObject.name == "Player") { 
     switch (Materialstate) 
     { 
      case 0: 
       renderComp.material = goal; 
       Materialstate = 1; 
       break; 
      case 1: 
       renderComp.material = starting; 
       Materialstate = 0; 
       break; 
      default: 
       // Invalid Materialstate throw exception/error 
     } 
    } 
} 

我希望這有助於!