【问题标题】:Unity2d: enemies won't spawn at random spawnpointUnity2d:敌人不会在随机生成点生成
【发布时间】:2016-12-16 18:51:20
【问题描述】:

团结一致,我希望游戏开始时敌人在随机生成点生成 (我在游戏中创建了 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);

}
}

【问题讨论】:

    标签: c# unity3d spawning


    【解决方案1】:

    Random.Range 返回包含范围值,因此 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) ]
    

    应该可以解决您的问题。

    【讨论】:

      【解决方案2】:

      也许尝试改变

      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);
      

      【讨论】:

      • 没问题。正如 Rian 所提到的,您的代码很容易出现 IndOutOfRance 例外。此外,您传递的变换不是您从随机生成点解析返回的变换
      猜你喜欢
      • 1970-01-01
      • 2019-08-22
      • 1970-01-01
      • 1970-01-01
      • 2011-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多