2016-11-26 248 views
0

該計數器會隨機增加。這讓我瘋狂。OnTriggerEnter被多次調用

當玩家拿起關卡(10)上的所有遊戲對象時,關卡應該重新開始。

然而這一工程,用隨機拿起對象也可以添加+1的成績,這是預期,或+2。

using UnityEngine; 
using System.Collections; 
using UnityEngine.SceneManagement; 
using UnityEngine.UI; 

public class Pickup : MonoBehaviour { 

    //Required Variables 
    public GameObject pointsObject; 
    public Text scoreText; 

    private int score; 
    private int scoreCount; 

    void Start() 
    { 
     score = 0; 
     SetScoreText(); 
     scoreCount = GameObject.FindGameObjectsWithTag("Pickups").Length; 
    } 

    void Update() 
    { 
     if(score >= scoreCount) 
     { 
      Scene scene = SceneManager.GetActiveScene(); 
      SceneManager.LoadScene(scene.name); 

     } 
     SetScoreText(); 
     Debug.Log("Found " + scoreCount + " Pickup Objects!"); 
    } 

    void OnTriggerEnter(Collider col) 
    { 
     if(col.gameObject.CompareTag("Pickups")) 
     { 
      Destroy(col.gameObject); 
      score++; 
     } 
    } 

    void SetScoreText() 
    { 
     scoreText.text = "Score: " + score.ToString(); 
    } 
} 

任何人都可以看到爲什麼我有這個問題,因爲我看不出爲什麼。提前致謝。

+0

add Debug.Log(「yo」+ gameObject.name);到OnTriggerEnter – Fattie

+0

Ben,一旦你開始編程更多,「分數」應該是一個具有「set」動作的屬性,只需改變那裏的文本。乾杯 – Fattie

回答

0

這本來是安裝在Pickup腳本到多個GameObjects的情況下,但我不這麼認爲,因爲Pickup腳本將不得不多個實例,並在你的問題中提到的得分不會遞增。

因爲這是消除,很可能你有超過1對撞機(是否觸發與否),附在GameObjects。這會導致OnTriggerEnter函數被多次調用。

你有2個解決方案:

.Find複製的對撞機,並從GameObjects刪除它們。在Pickups GameObjects和其他與它們對戰的GameObjects上檢查它。

。修改您的代碼並使其明白存在重複的對撞機。

每次調用OnTriggerEnter函數時,都可以通過列表來存儲每個10拾取器。檢查List中是否存在碰撞的GameObject。如果它存在於List中,則不要增加。如果它在List中不存在,則將其增加到List。這是非常簡單和容易實施的邏輯。沒有測試,但應該工作。

下面的代碼是它應該看起來像,如果你與解決方案#2

public class Pickup : MonoBehaviour 
{ 

    //Required Variables 
    public GameObject pointsObject; 
    public Text scoreText; 

    private int score; 
    private int scoreCount; 

    List<GameObject> pickups = new List<GameObject>(); 

    void Start() 
    { 
     score = 0; 
     SetScoreText(); 
     scoreCount = GameObject.FindGameObjectsWithTag("Pickups").Length; 
    } 

    void Update() 
    { 
     if (score >= scoreCount) 
     { 
      Scene scene = SceneManager.GetActiveScene(); 
      SceneManager.LoadScene(scene.name); 

     } 
     SetScoreText(); 
     Debug.Log("Found " + scoreCount + " Pickup Objects!"); 
    } 

    void OnTriggerEnter(Collider col) 
    { 
     if (col.gameObject.CompareTag("Pickups")) 
     { 
      //Increment if the gameObject is [not] already in the List 
      if (!pickups.Contains(col.gameObject)) 
      { 
       Destroy(col.gameObject); 
       score++; 
       //Now Add it to the List 
       pickups.Add(col.gameObject); 
      } 
     } 
    } 

    //Call this after GameOver to clear List 
    void resetPickupsList() 
    { 
     pickups.Clear(); 
    } 

    void SetScoreText() 
    { 
     scoreText.text = "Score: " + score.ToString(); 
    } 
}