Sono nuovo di Unity. Stavo imparando coroutine e ho scritto questo.
private void Fire()
{
if(Input.GetButtonDown("Fire1"))
{
StartCoroutine(FireContinuously());
}
if(Input.GetButtonUp("Fire1"))
{
StopAllCoroutines();
}
}
IEnumerator FireContinuously()
{
while(true)
{
GameObject laser = Instantiate(LaserPrefab, transform.position, Quaternion.identity) as GameObject;
laser.GetComponent<Rigidbody2D>().velocity = new Vector2(0, 10f);
yield return new WaitForSeconds(firetime);
}
}
Quando si preme il pulsante, viene chiamato il coroutine ed entra nel ciclo 'while'. Quando lascio il pulsante, interrompe la routine. Non dovrebbe rimanere bloccato nel ciclo 'while' in quanto è un ciclo infinito? Perché?
yield
è effettivamente l'abbreviazione di "Controllo del rendimento per il chiamante fino a quando non viene richiesto l'elemento successivo nell'enumerabile".
StopAllCoroutines()
in questo caso. Va bene quando usi sempre una sola routine, ma se hai mai pianificato di averne più di una, questo avrebbe effetti indesiderati. Invece dovresti usare StopCoroutine()
e fermare quello che è rilevante invece di tutti loro. ( StopAllCoroutines()
sarebbe utile ad esempio quando si termina il livello o si carica una nuova area, ecc., ma non per cose specifiche come "Non sto più sparando".)
"Fire1"
, è qualcosa che puoi impostare nel motore per consentire la modifica dei tasti anziché la digitazioneKeycode.Foo
?