Unity зависает при нажатии кнопки воспроизведения - PullRequest
0 голосов
/ 16 июня 2020

Я изучаю Unity через курс udemy.

Теперь я застрял в точке, где экран Unity зависает, когда я нажимаю кнопку воспроизведения. Это происходит в диспетчере возрождения для случайно расположенных врагов и бонусов, IEnumerator для врагов работает отлично, но как только я добавляю то же самое для бонуса и нажимаю кнопку воспроизведения, он зависает.

Когда Я закомментирую раздел powerup в диспетчере возрождения и перезапускаю Unity, он работает отлично.

Что мне делать, чтобы мой спавн работал?

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SpawnManager : MonoBehaviour
{
    [SerializeField]
    private GameObject _enemyShipPrefab;
    [SerializeField]
    private GameObject[] powerup;

    // Start is called before the first frame update
    void Start()
    {
        StartCoroutine(EnemySpawnRoutine());
        StartCoroutine(PowerupSpawnRoutine());
    }

    public IEnumerator EnemySpawnRoutine()
    {
        while(true)
        {
            float enemyPositionX = Random.Range(-8.34f, 8.34f);
            Instantiate(_enemyShipPrefab, new Vector3(enemyPositionX, 6.39f, 0), Quaternion.identity);
            yield return new WaitForSeconds(5.0f);
        }
    }

    public IEnumerator PowerupSpawnRoutine()
    {
        while(true)
        {
            // float powerupPositionX = Random.Range(-8.622f, 8.622f);
            int randomPowerup = Random.Range(0, 3);
            Instantiate(powerup[randomPowerup], new Vector3(Random.Range(-8.622f, 8.622f), 4.5f, 0), Quaternion.identity);
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 16 июня 2020

В вашем PowerupSpawnRoutine while(true) всегда будет работать как бесконечный l oop. Внутри вас нет yield.

Вы также должны добавить задержку в свой PowerupSpawnRoutine.

public IEnumerator PowerupSpawnRoutine()
{
    while(true)
    {
        // float powerupPositionX = Random.Range(-8.622f, 8.622f);
        int randomPowerup = Random.Range(0, 3);
        Instantiate(powerup[randomPowerup], new Vector3(Random.Range(-8.622f, 8.622f), 4.5f, 0), Quaternion.identity);

        // this e.g. will spawn powerup after every 5 seconds.
        yield return new WaitForSeconds(5.0f); 
    }
}
0 голосов
/ 16 июня 2020

Как уже упоминалось Мухаммадом Фарханом Акилом , вы не yield нигде внутри while(true) l oop в PowerupSpawnRoutine.


Однако , в качестве полной альтернативы вместо использования Coroutines вы также можете использовать InvokeRepeating в своем варианте использования:

[SerializeField] private float enemySpawnDelay = 5f;
[SerializeField] private float powerupSpawnDelay = 5f;

// Start is called before the first frame update
void Start()
{
    // The first parameter is the initial delay so 0 makes the first call
    // immediately.
    // The second parameter is the repeating delay
    InvokeRepeating(nameof(EnemySpawnRoutine), 0f, enemySpawnDelay);
    InvokeRepeating(nameof(PowerupSpawnRoutine), 0f, powerupSpawnDelay);
}

private void EnemySpawnRoutine()
{
    float enemyPositionX = Random.Range(-8.34f, 8.34f);
    Instantiate(_enemyShipPrefab, new Vector3(enemyPositionX, 6.39f, 0), Quaternion.identity);
}

private void PowerupSpawnRoutine()
{
    // when getting random indices use the actual length of the array to be more
    // flexible and secure against errors
    int randomPowerup = Random.Range(0, powerup.Length);
    Instantiate(powerup[randomPowerup], new Vector3(Random.Range(-8.622f, 8.622f), 4.5f, 0), Quaternion.identity);
}
...