Unity3D:如何控制生成器,等待波完成时不会停止实例化
Unity3D: How to control spawner, doesn't stop instantiating when waiting for wave to finish
Unity3D 2018.2.4 C#
在这个生成器代码中,它一直在实例化。我如何阻止生成实例化,直到所有生成的敌人都被摧毁。
我正在查看
if (destroyedEnemyCounter == enemyStartAmount)
因为我正在计算所有被摧毁的敌人以及 wave spawner 乘以 enemyStartAmount 的数量,但是即使我将 wave 转发放在 if 语句中,代码也会继续实例化。
我如何添加一个限制来阻止生成器实例化,直到 wave/round 的计数被销毁并能够移动到下一个 wave/round?
这是我目前的代码
private int enemyStartAmount = 2;
private int multiply = 2;
private float startWait = 30.0f;
private float spawnWait = 2.0f;
private float waveWait = 28.0f;
// Start
private void OnEnable()
{
startCountDownTimer = startWait;
waveCurrentCount = 1;
StartCoroutine(SpawnWaves());
}
// Update
private void FixedUpdate()
{
// For Text: StartTimer
if (isStartTimerFinished == false)
{
startCountDownTimer -= Time.deltaTime;
}
// For Text: When StartTimer isFinished
if (isStartTimerFinished == false && startCountDownTimer <= 0f)
{
isStartTimerFinished = true;
}
// For Text: When startTimer ends and Spawner Starts
if (isStartTimerFinished == true)
{
// Game Timer
stopWatchTimer += Time.deltaTime;
}
}
// Main: Spawn Waves
IEnumerator SpawnWaves()
{
// Start when First Countdown isFinished
yield return new WaitForSeconds(startWait);
while (true)
{
for (int i = 0; i < enemyStartAmount; i++)
{
// Each Wave is a different way
switch (waveCurrentCount)
{
case 1:
Transform spawnPoint = innerLevelSpawns[(int)Random.Range(0, innerLevelSpawns.Length)].transform;
Quaternion spawnRotation = Quaternion.identity;
Instantiate(enemyTypes[(int)Random.Range(0, 0)], spawnPoint.position, spawnRotation);
break;
...
case 8:
Transform spawnPoint8 = outerLevelSpawns[(int)Random.Range(0, outerLevelSpawns.Length)].transform;
Quaternion spawnRotation8 = Quaternion.identity;
Instantiate(enemyTypes[(int)Random.Range(0, 0)], spawnPoint8.position, spawnRotation8);
break;
default:
Transform spawnPoint9 = outerLevelSpawns[(int)Random.Range(0, outerLevelSpawns.Length)].transform;
Quaternion spawnRotation9 = Quaternion.identity;
Instantiate(enemyTypes[(int)Random.Range(0, enemyTypes.Length)], spawnPoint9.position, spawnRotation9);
break;
}
yield return new WaitForSeconds(spawnWait);
}
// Check if enemyCount has been destroyed -> then send next wave
enemiesInScene = GameObject.FindGameObjectsWithTag("Enemy");
enemiesInSceneText.text = "Total Spawned: " + enemiesInScene.Length.ToString();
// Next Wave -----------Hold Spawn when Wave Amount Destroyed--------------------------
if (destroyedEnemyCounter == enemyStartAmount)
{
Debug.Log("Next Wave Incoming");
// Multiply Enemy Count
enemyStartAmount = enemyStartAmount * multiply;
// Count Waves
waveCurrentCount = ++waveCurrentCount;
yield return new WaitForSeconds(waveWait);
}
}
}
检查后
if (destroyedEnemyCounter == enemyStartAmount)
循环将再次开始,再次生成 enemyStartAmount
。
你可以做的是在生成逻辑周围添加一个条件,例如在 if (destroyedEnemyCounter == enemyStartAmount)
中将 bool readyForNextWave
设置为 true
if(readyForNextWave)
{
readyForNextWave = false;
for (int i = 0; i < enemyStartAmount; i++)
{
// Each Wave is a different way
// ...
yield return new WaitForSeconds(spawnWait);
}
}
// ...
if (destroyedEnemyCounter == enemyStartAmount)
{
readyForNextWave = true;
Debug.Log("Next Wave Incoming");
// ...
}
替换
if (destroyedEnemyCounter == enemyStartAmount)
有
yield return new WaitUntil(() => destroyedEnemyCounter == enemyStartAmount);
Unity3D 2018.2.4 C#
在这个生成器代码中,它一直在实例化。我如何阻止生成实例化,直到所有生成的敌人都被摧毁。
我正在查看
if (destroyedEnemyCounter == enemyStartAmount)
因为我正在计算所有被摧毁的敌人以及 wave spawner 乘以 enemyStartAmount 的数量,但是即使我将 wave 转发放在 if 语句中,代码也会继续实例化。
我如何添加一个限制来阻止生成器实例化,直到 wave/round 的计数被销毁并能够移动到下一个 wave/round?
这是我目前的代码
private int enemyStartAmount = 2;
private int multiply = 2;
private float startWait = 30.0f;
private float spawnWait = 2.0f;
private float waveWait = 28.0f;
// Start
private void OnEnable()
{
startCountDownTimer = startWait;
waveCurrentCount = 1;
StartCoroutine(SpawnWaves());
}
// Update
private void FixedUpdate()
{
// For Text: StartTimer
if (isStartTimerFinished == false)
{
startCountDownTimer -= Time.deltaTime;
}
// For Text: When StartTimer isFinished
if (isStartTimerFinished == false && startCountDownTimer <= 0f)
{
isStartTimerFinished = true;
}
// For Text: When startTimer ends and Spawner Starts
if (isStartTimerFinished == true)
{
// Game Timer
stopWatchTimer += Time.deltaTime;
}
}
// Main: Spawn Waves
IEnumerator SpawnWaves()
{
// Start when First Countdown isFinished
yield return new WaitForSeconds(startWait);
while (true)
{
for (int i = 0; i < enemyStartAmount; i++)
{
// Each Wave is a different way
switch (waveCurrentCount)
{
case 1:
Transform spawnPoint = innerLevelSpawns[(int)Random.Range(0, innerLevelSpawns.Length)].transform;
Quaternion spawnRotation = Quaternion.identity;
Instantiate(enemyTypes[(int)Random.Range(0, 0)], spawnPoint.position, spawnRotation);
break;
...
case 8:
Transform spawnPoint8 = outerLevelSpawns[(int)Random.Range(0, outerLevelSpawns.Length)].transform;
Quaternion spawnRotation8 = Quaternion.identity;
Instantiate(enemyTypes[(int)Random.Range(0, 0)], spawnPoint8.position, spawnRotation8);
break;
default:
Transform spawnPoint9 = outerLevelSpawns[(int)Random.Range(0, outerLevelSpawns.Length)].transform;
Quaternion spawnRotation9 = Quaternion.identity;
Instantiate(enemyTypes[(int)Random.Range(0, enemyTypes.Length)], spawnPoint9.position, spawnRotation9);
break;
}
yield return new WaitForSeconds(spawnWait);
}
// Check if enemyCount has been destroyed -> then send next wave
enemiesInScene = GameObject.FindGameObjectsWithTag("Enemy");
enemiesInSceneText.text = "Total Spawned: " + enemiesInScene.Length.ToString();
// Next Wave -----------Hold Spawn when Wave Amount Destroyed--------------------------
if (destroyedEnemyCounter == enemyStartAmount)
{
Debug.Log("Next Wave Incoming");
// Multiply Enemy Count
enemyStartAmount = enemyStartAmount * multiply;
// Count Waves
waveCurrentCount = ++waveCurrentCount;
yield return new WaitForSeconds(waveWait);
}
}
}
检查后
if (destroyedEnemyCounter == enemyStartAmount)
循环将再次开始,再次生成 enemyStartAmount
。
你可以做的是在生成逻辑周围添加一个条件,例如在 if (destroyedEnemyCounter == enemyStartAmount)
bool readyForNextWave
设置为 true
if(readyForNextWave)
{
readyForNextWave = false;
for (int i = 0; i < enemyStartAmount; i++)
{
// Each Wave is a different way
// ...
yield return new WaitForSeconds(spawnWait);
}
}
// ...
if (destroyedEnemyCounter == enemyStartAmount)
{
readyForNextWave = true;
Debug.Log("Next Wave Incoming");
// ...
}
替换
if (destroyedEnemyCounter == enemyStartAmount)
有
yield return new WaitUntil(() => destroyedEnemyCounter == enemyStartAmount);