簡體   English   中英

OnTriggerEnter 多次調用

[英]OnTriggerEnter called multiple times

這個計數器會隨機遞增。 它讓我發瘋。

當玩家拿起關卡 (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();
    }
}

任何人都可以看到我為什么會遇到這個問題,因為我根本看不到原因。 提前致謝。

這本來是將Pickup腳本附加到多個 GameObjects 的情況,但我不這么認為,因為Pickup腳本會有多個實例,並且分數不會像您的問題中提到的那樣增加。

由於消除了這一點,很可能您有超過 1 個對撞機(無論是否觸發)附加到游戲對象。 這會導致多次調用OnTriggerEnter函數。

您有 2 個解決方案:

1 .找到重復的碰撞器並將它們從游戲對象中刪除。 在 Pickups GameObjects 和它們碰撞的其他 GameObjects 上檢查這一點。

2 .修改您的代碼並使其了解存在重復的碰撞器。

每次調用OnTriggerEnter函數時,您都可以通過制作一個列表來存儲這10 Pickup 中的每一個。 檢查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();
    }
}

不是為了恢復死線程,但我最近遇到了這個問題。 子彈觸發時會計數兩次。 發現這是因為兩個對象都有啟用 OnTrigger 的碰撞器。 我將enemyHitbox collider 放在一個單獨的層上(不與其他任何東西碰撞)並將其設置為OnTrigger false,而playerBullet 設置為OnTrigger true。 這為我解決了這個問題。

我假設這兩個對象都以某種方式導致了觸發事件,即使它被設置為一個帶有設置標簽的對象。

希望這可以幫助有類似問題的人。

順便說一句,此時使用 Unity2020。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM