[英]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.