Анамолия функциональности Coroutine in Unity после проверки состояния - PullRequest
0 голосов
/ 16 мая 2018

Я новичок в Unity, и я просто создавал простую игру-шутер, где я хочу, чтобы враги появлялись только тогда, когда игрок появляется.Итак, я создал сопрограмму, которая проверяет условие playerExists, если оно оказалось равным true, оно должно продолжать вызывать врагов каждые 5 секунд.Но по какой-то причине он порождает только одного врага.Я что-то здесь упускаю?Ниже мой SpawnManager, где контролируется поведение нереста.

public class SpawnManager : MonoBehaviour {

[SerializeField]
private GameObject _enemyShipPrefab;
[SerializeField]
private GameObject[] _powerUp;
UIManager _uimanager;


// Use this for initialization
void Start () {
    _uimanager = GameObject.Find("Canvas").GetComponent<UIManager>();
    StartCoroutine(SpawnPowerUps());
    StartCoroutine(SpawnEnemy());

}

IEnumerator SpawnEnemy(){
    while (_uimanager.playerExists == true)
    {
            Vector3 position = new Vector3(Random.Range(-8.23f, 8.23f), 5.7f, 0.0f);
            Instantiate(_enemyShipPrefab, position, Quaternion.identity);
            yield return new WaitForSeconds(5.0f);
    }

}

}

Ниже мой UIManager, где я контролирую существование игрока.

public class UIManager : MonoBehaviour {

// Use this for initialization
public bool playerExists = false; 
public int playerScores = 0; 
public Sprite[] lives;
public Image playerLivesImagesToBeShown;
public Text playerScoreToBeShown;
public Image titleImage;
public GameObject playerPrefab;
void Start()
{

}

void Update()
{

        if (Input.GetKeyDown(KeyCode.Space) && playerExists == false){
            titleImage.gameObject.SetActive(false);
            Instantiate(playerPrefab, new Vector3(0, 0, 0), Quaternion.identity);
            playerScores = 0;
            playerScoreToBeShown.text = "Score : 0";
            playerExists = true;
        }


}


public void updateLives(int livesToView ){
    playerLivesImagesToBeShown.sprite = lives[livesToView];
            if(livesToView == 0){
                playerExists = false;
                titleImage.gameObject.SetActive(true);
            }
}

1 Ответ

0 голосов
/ 16 мая 2018

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

IEnumerator SpawnEnemy ()
{
    while (true) // Keep checking
    {
        if(_uimanager.playerExists == true)
        {
            Vector3 position = new Vector3(Random.Range(-8.23f, 8.23f), 5.7f, 0.0f);
            Instantiate(_enemyShipPrefab, position, Quaternion.identity);            
            yield return new WaitForSeconds (5.0f);  // After spawning waits 5secs
        }
        yield return null; // Starts loop with next frame.
    }
}
...