У меня есть игра, в которой вы играете за кубик, и вам нужно уворачиваться от других кубиков, когда они появляются на вашем пути. Вражеские кубы должны появиться из-за сценария, который я назвал GameController. Но кубики не нерестятся. Пожалуйста помоги. (Также всякий раз, когда мой куб разрушается, игра и функции перезапуска не работают)

Я попытался воссоздать префаб и код, но ничего не вышло. Кроме того, тот же код работает и в других моих играх. Вот мой код:

void Start()
{
    gameOver = false;
    restart = false;
    restartText.text = "";
    gameOverText.text = "";
    score = 0;
    UpdateScore();
    StartCoroutine(SpawnWaves());
}

void Update()
{
    if (restart)
    {
        if (Input.GetKeyDown(KeyCode.R))
        {
            SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);

        }
    }
}

IEnumerator SpawnWaves()
{
    yield return new WaitForSeconds(startWait);
    while (true)
    {
        for (int i = 0; i < hazardCount; i++)
        {
            GameObject hazard = hazards[Random.Range(0, hazards.Length)];
            Vector3 spawnPosition = new Vector3(Random.Range(-spawnValues.x, spawnValues.x), spawnValues.y, spawnValues.z);
            Quaternion spawnRotation = Quaternion.identity;
            GameObject newSpawn = Instantiate(hazard, spawnPosition, spawnRotation) as GameObject;
            yield return new WaitForSeconds(spawnWait);
        }
        yield return new WaitForSeconds(waveWait);

        if (gameOver)
        {
            restartText.text = "Press 'R' for Restart";
            restart = true;
            break;
        }
    }
}

public void AddScore(int newScoreValue)
{
    score += newScoreValue;
    UpdateScore();
}

void UpdateScore()
{
    scoreText.text = "Score: " + score;
}

public void GameOver()
{
    gameOverText.text = "Game Over!";
    gameOver = true;
}

}

Я ожидаю появления врагов, но их нет

1
AcidicBlaster 27 Мар 2019 в 16:08

1 ответ

Лучший ответ

Я скопировал и вставил ваш пример кода в пример проекта. В этом примере ваш скрипт работает так, как ожидалось, поскольку вы уже упоминали, что он работает в других проектах.

Так что, на мой взгляд, это как-то связано с ценностями инспектора. Проверьте следующее: Вы проверили, что значение hazcount больше нуля? Ваш hazarray полностью заполнен сборными элементами? (В противном случае это должно вызвать не порождение, но также должно вызвать исключение нулевой ссылки.)

Другой вариант - сделать снимок экрана или каким-то образом указать свои значения в инспекторе, чтобы можно было воспроизвести ошибку.

Offtopic: ваш перезапуск после gameOver откладывается, потому что if (gameOver) -Clause идет после WaitForSeconds (waveWait). Я предлагаю изменить его на следующее:

public GameObject[] hazards;
public Vector3 spawnValues;
public int hazardCount;
public float spawnWait;
public float startWait;
public float waveWait;
public Text scoreText;
public Text restartText;
public Text gameOverText;
private bool gameOver;
private bool restart;
private int score;

private Coroutine gameRoutine;


void Start()
{
    gameOver = false;
    restart = false;
    restartText.text = "";
    gameOverText.text = "";
    score = 0;
    UpdateScore();
    gameRoutine = StartCoroutine(SpawnWaves());
}

void Update()
{
    if (restart)
    {
        if (Input.GetKeyDown(KeyCode.R))
        {
            SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);

        }
    }
}

IEnumerator SpawnWaves()
{
    yield return new WaitForSeconds(startWait);
    while (true)
    {
        for (int i = 0; i < hazardCount; i++)
        {
            GameObject hazard = hazards[Random.Range(0, hazards.Length)];
            Vector3 spawnPosition = new Vector3(Random.Range(-spawnValues.x, spawnValues.x), spawnValues.y, spawnValues.z);
            Quaternion spawnRotation = Quaternion.identity;
            GameObject newSpawn = Instantiate(hazard, spawnPosition, spawnRotation) as GameObject;
            yield return new WaitForSeconds(spawnWait);
        }
        yield return new WaitForSeconds(waveWait);    
    }
}

public void AddScore(int newScoreValue)
{
    score += newScoreValue;
    UpdateScore();
}

void UpdateScore()
{
    scoreText.text = "Score: " + score;
}

public void GameOver()
{
    gameOverText.text = "Game Over!";
    restartText.text = "Press 'R' for Restart";
    restart = true;
    gameOver = true;
    StopCoroutine(gameRoutine);
}

Что я здесь изменил, так это то, что условие if удалено, и сопрограмма теперь сохраняется в Start () и сразу останавливается при выполнении метода gameOver (). Другой вариант вместо StopCoroutine () - установить условие цикла while на while (! GameOver).

1
MSauer 27 Мар 2019 в 17:17