2016-11-26 358 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

Debug.Log( "yo" + gameObject.name); OnTriggerEnter – Fattie

+0

Ben、もう少しプログラミングを始めると、「スコア」は実際には「セット」アクションを持つプロパティになります。そこにあるテキストを変更するだけです。乾杯 – Fattie

答えて

0

Pickupスクリプトを複数のゲームオブジェクトに貼り付ける場合がありましたが、Pickupスクリプトに複数のインスタンスがあり、質問に記載されているようにスコアが増えないためとは思わないです。

これは削除されているため、ゲームオブジェクトに複数のコライダー(トリガーかどうか)が付いている可能性が非常に高いです。これにより、OnTriggerEnter関数が複数回呼び出されます。

あなたは2つのソリューションを持っている:

.Find重複コライダーとゲームオブジェクトからそれらを削除します。 Pickups GameObjectsや他のGameObjectsと衝突するかどうか確認してください。

。コードを変更し、重複したコライダーがあることを理解させてください。

OnTriggerEnter関数が呼び出されるたびに、それぞれの10ピックアップを格納するリストを作成すると、これを行うことができます。衝突したGameObjectがListに存在するか確認してください。 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(); 
    } 
} 
関連する問題