2016-11-26 687 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(); 
    } 
}