2017-01-23 64 views
0

我在場景中有兩個遊戲對象,我將這個腳本分配給它們兩個。當我點擊其中任何一個時,If語句中與每個語句相關的代碼都會被執行兩次,如果我禁用它們中的一個,它會被執行一次。 使用Raycast檢測對象被執行兩次

void Update() 
{ 
    if (Input.GetMouseButtonDown(0)) 
    { 
     RaycastHit hit; 
     Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 

     if (Physics.Raycast(ray, out hit)) 
     { 
      if (hit.transform.name == "Object A") 
      { 
       Debug.Log("Object A Clicked"); // log twice 
      } 

      if (hit.transform.name == "Object B") 
      { 
       Debug.Log("Object B Clicked"); // log twice 
      } 
     } 
    } 
} 

的問題是,爲什麼代碼獲取與執行兩次爲一個單一的點擊?

回答

1

問題是,爲什麼代碼被執行兩次,單擊一次 ?!

因爲每個腳本的每個Update()函數被稱爲每一幀。 Input.GetMouseButtonDown(0)將在每個腳本中的每個幀中都爲true,並在Update函數中包含該腳本。

如果你想它來檢測一次,你兩個選擇:

.Attach腳本一個只有遊戲對象。通常是一個空的GameObject。它應該在點擊時檢測到任何有對撞機的Gamebject。使用IPointerDownHandler及其OnPointerDown函數。你可以將它附加到你想檢測點擊的每個GameObject上。檢查#6here對於2D /精靈。對於3D對象,請檢查#6

+0

謝謝你,幫助。 – Abdou023

0

這是因爲,當你打一靶,利用點擊被執行兩次,它這樣做

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 

這行代碼,將會給你的對象,因爲你必須在腳本中2個對象,它將運行2次完全相同的事情。兩個物體都會收到相同的ray

+1

謝謝你的回答。 – Abdou023

0

它記錄了兩次,因爲當你點擊鼠標左鍵時,這兩個對象都發送射線。然後他們兩個使用鼠標位置從相機發送光線。然後這兩條光線都會撞擊和反射;

  • 萬一他們打,他們記錄相同的命中對象的名稱
  • 如果他們不打什麼,他們沒有做任何事情。

一個可能的解決辦法:

void Update() 
{ 
    if (Input.GetMouseButtonDown(0)) 
    { 
     RaycastHit hit; 
     Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 

     if (Physics.Raycast(ray, out hit) && hit.transform == transform) 
     { 
      if (hit.transform.name == "Object A") 
      { 
       Debug.Log("Object A Clicked"); // log twice 
      } 

      if (hit.transform.name == "Object B") 
      { 
       Debug.Log("Object B Clicked"); // log twice 
      } 
     } 
    } 
} 

通過添加 「hit.transform ==變換」 中的if條件,就不會引發其他的對象記錄它。但是,這仍然不是一個理想的解決方案,因爲所有的物體都會發射光線並檢查光線是否擊中了它們。

更好的方法是從一箇中央腳本發送光線,並讓該腳本告訴對象它已被射線擊中。

+0

謝謝你的回答。 – Abdou023