我的场景中有超过 100 个(接近 200 个)敌人游戏对象,每秒生成 5-6 个。我正在使用对象池,对象不会每次都被实例化,而只会在需要时才实例化...
我的场景中有超过 100 个(接近 200 个)敌人游戏对象,每秒生成 5-6 个。我使用对象池,对象不会每次都实例化,而只在需要时实例化。我试图记录统计数据,以便显示剩余敌人总数和击落敌人总数。对各个游戏对象进行简单的加减数学运算,结果加起来并不等于应有的数。例如:生成的敌人总数为 200(当我没有杀死一个敌人时)我瞬间杀死了很多敌人,但当我杀死所有敌人时,剩余的敌人并不总是为零。
我尝试在敌人出现时将其逐一杀死,加减运算正确。
那么,如何在不损失准确性的情况下,对多个游戏对象中的变量进行加减操作呢?
public void TookDownEnemy(int enemiesTookDown)
{
//enemiesAlive -= enemiesTookDown;
enemiesTakenDown += enemiesTookDown;
Debug.Log("stats, enemies took down: " + enemiesTakenDown);
UpdateStats();
}
public void SpawnedNewEnemy(int spawned)
{
enemiesAlive += spawned;
UpdateStats();
}
public void UpdateStats()
{
enemiesTakenDownText.text = ": " + enemiesTakenDown.ToString();
enemiesAliveText.text = ": " + (enemiesAlive - enemiesTakenDown).ToString();
}
每当新敌人生成时,我都会从敌人生成的游戏对象中调用 SpawnedNewEnemy,而当新敌人生成时,游戏对象就会调用 TookDownEnemy。
public void InstantiateNewEnemy()
{
StatsManager.Instance.SpawnedNewEnemy(1);
Enemy instance = ObjectPooler.DequeueObject<Enemy>("Enemy");
instance.Initialize(10.0f); // get this hp value from the experience manager
instance.SetThisAlive();
instance.gameObject.SetActive(true);
instance.transform.SetParent(enemiesHolder);
int randomIndex = Random.Range(0, enemySpawnPoints.childCount);
instance.transform.position = enemySpawnPoints.GetChild(randomIndex).position;
instance.transform.rotation = Quaternion.identity;
}
类似地,当敌人被杀或死亡时
if(hp <= 0 && !isDead)
{
//Destroy(this.gameObject); // use pooling here
isDead = true;
StatsManager.Instance.TookDownEnemy(1);
this.GetComponent<Animator>().Play("playDead");
Invoke("EnqueueGameObject", 0.25f);
}
我没有直接对变量进行加减操作,而是创建了三个不同的变量。
-
敌人生成
-
敵人被擊斃
-
剩余敌人
其中 enemyRemaining = enemySpawned - enemyTookDown
即使这也有差异。我假设应该有一种方法可以将加法和减法运算排队,而不是仅仅执行它。
更新:我尝试通过排队加法和减法运算并以定义的时间间隔执行这些运算来完成此操作。
public void TookDownEnemy(int enemiesTookDown)
{
enemiesTookDownQueue.Enqueue(enemiesTookDown);
}
public void SpawnedNewEnemy(int spawned)
{
enemiesAliveQueue.Enqueue(spawned);
}
现在我还将敌人的生成数量限制为 260(根据时间,我总共生成 260 个敌人)。当使用队列进行加减时,我 加起来 (双关语)总是得到 80 的差值。其中剩余 80 个敌人,而我击落了 180 个。
这是我每 2 秒将这些数字相加的方法。
public void UpdateStats()
{
while(enemiesAliveQueue.Count > 0)
{
enemiesAlive += (int)enemiesAliveQueue.Dequeue();
}
while(enemiesTookDownQueue.Count > 0)
{
enemiesTakenDown += (int)enemiesTookDownQueue.Dequeue();
}
enemiesTakenDownText.text = ": " + enemiesTakenDown.ToString();
coinsCollectedText.text = ": " + coinsCollected.ToString();
enemiesAliveText.text = ": " + (enemiesAlive - enemiesTakenDown).ToString();
}