Привет. Есть такой код -
if (Input.GetButtonDown("Reload") && !InRealod && Ammo < MaxAmmo)
{
StartCoroutine(ReloadCountdown());
}
if (InRealod && Input.GetButtonDown("Fire") && Ammo != 0)
{
StopCoroutine(ReloadCountdown());
}
IEnumerator ReloadCountdown()
{
while (Ammo < MaxAmmo)
{
InRealod = true;
yield return new WaitForSeconds(ReloadTime);
Ammo++;
InRealod = false;
}
}
Но корутина не прерывается. Все условия соблюдаются. Но она сама прерывается когда Ammo == MaxAmmo. Даже если сделать так -
IEnumerator ReloadCountdown()
{
while (Ammo < MaxAmmo && !Input.GetButtonDown("Fire"))
{
InRealod = true;
yield return new WaitForSeconds(ReloadTime);
Ammo++;
InRealod = false;
}
}
ничего не получается. Идея такая - зарядка патронов в оружие должна идти пока игрок не нажмёт на кнопку огня(если Ammo != 0). Почему не получается прервать корутину?
В строчке StopCoroutine(ReloadCountdown()) - вы по факту сначала запускаете новую корутину перезарядки, а затем её же и останавливаете. Вам нужно кешировать корутину, которую возвращает StartCoroutine(), а в метод StopCoroutine передавать ссылку на неё. К тому же проверку ссылки на корутину перезарядки можно использовать вместо флага InRealod. Внизу код реализации.
А во втором случае ваша проблема связана с тем, что проверка на ввод осуществляется не каждый кадр. Когда вы вызываете yield return new WaitForSeconds(ReloadTime) - корутина приостанавливается на длительность этого таймера и только потом продолжает выполнение. Т.е. она не будет знать нажали вы кнопку или нет, пока она ждала.
Coroutine _reloadRoutine;
void Update()
{
if (Input.GetButtonDown("Reload") && _reloadRoutine == null && Ammo < MaxAmmo)
{
_reloadRoutine = StartCoroutine(ReloadCountdown());
}
if (_reloadRoutine != null && Input.GetButtonDown("Fire") && Ammo != 0)
{
StopCoroutine(_reloadRoutine);
_reloadRoutine = null;
}
}
IEnumerator ReloadCountdown()
{
while (Ammo < MaxAmmo)
{
InRealod = true;
yield return new WaitForSeconds(ReloadTime);
Ammo++;
InRealod = false;
}
_reloadRoutine = null;
}
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости