多次调用OnTriggerEnter

时间:2016-11-26 15:18:32

标签: c# unity3d count increment

此计数器会随机增加。它让我发疯了。

当玩家在等级(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();
    }
}

任何人都可以理解为什么我会遇到这个问题,因为我根本无法看到原因。提前谢谢。

2 个答案:

答案 0 :(得分:0)

这可能是将Pickup脚本附加到多个GameObjects的情况,但我不这么认为,因为Pickup脚本会有多个实例并且分数不会增加,如上所述你的问题。

由于已经消除了这种情况,因此很可能你有超过1个碰撞器(无论是否触发)附加了GameObjects。这会导致多次调用OnTriggerEnter函数。

你有2个解决方案:

1 。找到重复的碰撞对象并将其从游戏对象中删除。在Pickups GameObjects和他们碰撞的其他GameObjects上检查一下。

2 。修改您的代码,让它了解有重复的对撞机。

您可以通过在每次调用10函数时创建一个列表来存储每个OnTriggerEnter代答来执行此操作。检查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();
    }
}

答案 1 :(得分:0)

不是要恢复死线程,但是最近我遇到了这个问题。触发时,子弹会计数两次。发现这是因为两个对象都启用了OnTrigger的对撞机。我将敌人打击盒碰撞器放置在单独的图层上(不与其他任何碰撞),并将其设置为OnTrigger false,而将playerBullet设置为OnTrigger true。这为我解决了这个问题。

我假设两个对象都以某种方式引起了触发事件,即使该事件是为使用设置标签击中另一个对象而设置的。

希望这可以帮助遇到类似问题的人。

此时顺便使用Unity2020。