【问题标题】:OnTriggerEnter called multiple timesOnTriggerEnter 多次调用
【发布时间】:2016-11-26 15:18:32
【问题描述】:

这个计数器会随机增加。快把我逼疯了。

当玩家拾起关卡 (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();
    }
}

谁能明白我为什么会遇到这个问题,因为我根本看不到原因。提前致谢。

【问题讨论】:

  • 添加Debug.Log("yo" +gameObject.name);到 OnTriggerEnter
  • Ben,一旦你开始更多地编程,“score”应该是一个带有“set”操作的属性,只需更改其中的文本即可。干杯

标签: c# unity3d count increment


【解决方案1】:

这是将Pickup 脚本附加到多个游戏对象的情况,但我不这么认为,因为Pickup 脚本将有多个实例,并且分数不会像您的问题中提到的那样增加。

由于已消除,很可能您有超过 1 个碰撞器(无论是否触发)附加到游戏对象。这会导致OnTriggerEnter 函数被多次调用。

您有 2 个解决方案:

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

2.修改你的代码,让它明白有一个重复的碰撞器。

您可以通过在每次调用 OnTriggerEnter 函数时创建一个列表来存储每个 10 Pickups 来做到这一点。检查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();
    }
}

【讨论】:

    【解决方案2】:

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

    我假设这两个对象都以某种方式引发了触发事件,即使它被设置为使用 set 标记击中另一个对象。

    希望这对遇到类似问题的人有所帮助。

    顺便说一句,此时使用 Unity2020。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多