Unity2d:敌人不会在随机生成点生成
Unity2d: enemies won't spawn at random spawnpoint
在统一中,我希望游戏开始时敌人会在随机生成点生成
(我在游戏中制作了 3 个重生点)但敌人没有在其中一个重生点重生。
我做错了什么?
这是我的代码:
使用UnityEngine;
使用 System.Collections;
public class WaveSpawner : MonoBehaviour {
public enum Spawnstate {SPAWNING, WAITING, COUNTING };
[System.Serializable]
public class Wave
{
public string name;
public Transform enemy;
public int count;
public float rate;
}
public Wave[] waves;
private int nextWave = 0;
public float timeBetweenWaves = 5f;
public float waveCountdown;
public Transform[] spawnPoints;
private float searchCountdown = 1f;
private Spawnstate state = Spawnstate.COUNTING;
void Start()
{
if (spawnPoints.Length == 0)
{
Debug.LogError("No spawn points referenced");
}
waveCountdown = timeBetweenWaves;
}
void Update()
{
if(state == Spawnstate.WAITING)
{
if(!EnemyIsAlive())
{
WaveCompleted();
}
else
{
return;
}
}
if(waveCountdown <= 0)
{
if(state != Spawnstate.SPAWNING)
{
StartCoroutine(SpawnWave(waves[nextWave]));
}
}
else
{
waveCountdown -= Time.deltaTime;
}
}
void WaveCompleted()
{
Debug.Log("Wave Completed!");
state = Spawnstate.COUNTING;
waveCountdown = timeBetweenWaves;
if (nextWave + 1 > waves.Length - 1)
{
nextWave = 0;
Debug.Log("Completed all waves!");
}
else
{
nextWave++;
}
}
bool EnemyIsAlive()
{
searchCountdown -= Time.deltaTime;
if (searchCountdown <= 0f)
{
searchCountdown = 1f;
if (GameObject.FindGameObjectWithTag("Enemy") == null)
{
return false;
}
}
return true;
}
IEnumerator SpawnWave(Wave _wave)
{
Debug.Log("Spawning Wave: " + _wave.name);
state = Spawnstate.SPAWNING;
for(int i = 0; i < _wave.count; i++)
{
SpawnEnemy(_wave.enemy);
yield return new WaitForSeconds(1f/ _wave.rate);
}
state = Spawnstate.WAITING;
yield break;
}
void SpawnEnemy(Transform _enemy)
{
Debug.Log("Spawning Enemy: " + _enemy.name);
Transform _sp = spawnPoints[ Random.Range (0, spawnPoints.Length) ];
Instantiate(_enemy, transform.position, transform.rotation);
}
}
Random.Range returns 包含范围值,因此 0 到 5 可以包含 0 和 5。
数组索引是从零开始的,因此具有 5 个元素的数组将具有 0 到 4。
所以在你调用 SpawnEnemy 方法时
spawnPoints[ Random.Range (0, spawnPoints.Length) ]
如果 Random.Range 提供 spawnPoints.Length
它将失败。
改成
spawnPoints[ Random.Range (0, spawnPoints.Length-1) ]
应该可以解决您的问题。
也许尝试改变
Transform _sp = spawnPoints[ Random.Range (0, spawnPoints.Length) ];
Instantiate(_enemy, transform.position, transform.rotation);
类似于
Transform _sp = spawnPoints[ Random.Range (0, spawnPoints.Length-1) ];
Instantiate(_enemy, _sp.position, _sp.rotation);
在统一中,我希望游戏开始时敌人会在随机生成点生成 (我在游戏中制作了 3 个重生点)但敌人没有在其中一个重生点重生。
我做错了什么?
这是我的代码:
使用UnityEngine; 使用 System.Collections;
public class WaveSpawner : MonoBehaviour {
public enum Spawnstate {SPAWNING, WAITING, COUNTING };
[System.Serializable]
public class Wave
{
public string name;
public Transform enemy;
public int count;
public float rate;
}
public Wave[] waves;
private int nextWave = 0;
public float timeBetweenWaves = 5f;
public float waveCountdown;
public Transform[] spawnPoints;
private float searchCountdown = 1f;
private Spawnstate state = Spawnstate.COUNTING;
void Start()
{
if (spawnPoints.Length == 0)
{
Debug.LogError("No spawn points referenced");
}
waveCountdown = timeBetweenWaves;
}
void Update()
{
if(state == Spawnstate.WAITING)
{
if(!EnemyIsAlive())
{
WaveCompleted();
}
else
{
return;
}
}
if(waveCountdown <= 0)
{
if(state != Spawnstate.SPAWNING)
{
StartCoroutine(SpawnWave(waves[nextWave]));
}
}
else
{
waveCountdown -= Time.deltaTime;
}
}
void WaveCompleted()
{
Debug.Log("Wave Completed!");
state = Spawnstate.COUNTING;
waveCountdown = timeBetweenWaves;
if (nextWave + 1 > waves.Length - 1)
{
nextWave = 0;
Debug.Log("Completed all waves!");
}
else
{
nextWave++;
}
}
bool EnemyIsAlive()
{
searchCountdown -= Time.deltaTime;
if (searchCountdown <= 0f)
{
searchCountdown = 1f;
if (GameObject.FindGameObjectWithTag("Enemy") == null)
{
return false;
}
}
return true;
}
IEnumerator SpawnWave(Wave _wave)
{
Debug.Log("Spawning Wave: " + _wave.name);
state = Spawnstate.SPAWNING;
for(int i = 0; i < _wave.count; i++)
{
SpawnEnemy(_wave.enemy);
yield return new WaitForSeconds(1f/ _wave.rate);
}
state = Spawnstate.WAITING;
yield break;
}
void SpawnEnemy(Transform _enemy)
{
Debug.Log("Spawning Enemy: " + _enemy.name);
Transform _sp = spawnPoints[ Random.Range (0, spawnPoints.Length) ];
Instantiate(_enemy, transform.position, transform.rotation);
}
}
Random.Range returns 包含范围值,因此 0 到 5 可以包含 0 和 5。
数组索引是从零开始的,因此具有 5 个元素的数组将具有 0 到 4。
所以在你调用 SpawnEnemy 方法时
spawnPoints[ Random.Range (0, spawnPoints.Length) ]
如果 Random.Range 提供 spawnPoints.Length
它将失败。
改成
spawnPoints[ Random.Range (0, spawnPoints.Length-1) ]
应该可以解决您的问题。
也许尝试改变
Transform _sp = spawnPoints[ Random.Range (0, spawnPoints.Length) ];
Instantiate(_enemy, transform.position, transform.rotation);
类似于
Transform _sp = spawnPoints[ Random.Range (0, spawnPoints.Length-1) ];
Instantiate(_enemy, _sp.position, _sp.rotation);