此计数器会随机增加。它让我发疯了。
当玩家在等级(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 :(得分: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。