Я новичок в Unity. Я изучал сопрограммы, и я написал это.
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);
}
}
Когда кнопка нажата, вызывается сопрограмма, и она входит в цикл while. Когда я оставляю кнопку, она останавливает сопрограмму. Разве он не должен застрять в цикле 'while', поскольку это бесконечный цикл? Почему?
yield
это фактически означает «контроль доходности для вызывающего до тех пор, пока не будет запрошен следующий элемент в Enumerable».
StopAllCoroutines()
в этом случае. Это хорошо, когда вы используете только одну сопрограмму, но если вы когда-либо планировали иметь более одной, это может иметь нежелательные эффекты. Вместо этого вы должны использовать StopCoroutine()
и просто остановить тот, который имеет значение, а не все из них. ( StopAllCoroutines()
было бы полезно, например, при завершении уровня или загрузке новой области и т. д., но не для конкретных вещей, таких как «Я больше не стреляю».)
"Fire1"
Это то, что вы можете настроить в движке, чтобы разрешить перераспределение клавиш вместо того, чтобы печататьKeycode.Foo
?