首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Unity2d:敌人不会在随机产卵点产生

Unity2d:敌人不会在随机产卵点产生
EN

Stack Overflow用户
提问于 2016-08-10 19:44:19
回答 2查看 212关注 0票数 1

为了统一,我希望当游戏开始时,敌人在一个随机的产卵点产卵(我在游戏中制作了3个产卵点),但敌人不会在其中一个点产卵。

我做错什么了?

下面是我的代码:

使用UnityEngine;使用System.Collections;

代码语言:javascript
复制
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);

}
}

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-10 19:58:31

也许试着去改变

代码语言:javascript
复制
Transform _sp = spawnPoints[ Random.Range (0, spawnPoints.Length) ];
Instantiate(_enemy, transform.position, transform.rotation);

类似这样的东西

代码语言:javascript
复制
Transform _sp = spawnPoints[ Random.Range (0, spawnPoints.Length-1) ];
Instantiate(_enemy, _sp.position, _sp.rotation);
票数 0
EN

Stack Overflow用户

发布于 2016-08-10 19:56:13

Random.Range返回包含范围的值,因此0到5可以包括0和5。

数组索引是从零开始的,因此具有5个元素的数组将有0到4个元素。

因此,在SpawnEnemy方法中,当您调用

代码语言:javascript
复制
spawnPoints[ Random.Range (0, spawnPoints.Length) ]

如果Random.Range提供spawnPoints.Length,它将失败。

将其更改为

代码语言:javascript
复制
spawnPoints[ Random.Range (0, spawnPoints.Length-1) ]

应该能解决你的问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38872524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档