Опасности в моей игре единства не порождают - PullRequest
1 голос
/ 27 марта 2019

У меня есть игра, в которой вы являетесь кубом игрока, и вы должны уклоняться от других кубов, когда они проходят через ваш путь. Вражеские кубы должны появляться из-за скрипта, который я назвал 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 Ответ

1 голос
/ 27 марта 2019

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

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

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

Offtopic: ваш перезапуск после gameOver задерживается, потому что условие if (gameOver) следует после 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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...