Ожидание выполнения корутины

Программирование на Юнити.

Ожидание выполнения корутины

Сообщение MrDmitry 30 мар 2023, 21:24

Башня должна стрелять с задержкой между выстрелами пока есть снаряды, снаряды кончились, башня должна уйти на перезарядку. Для этого написал такой код

Синтаксис:
Используется csharp
    private IEnumerator DelayShoot()
    {
        while (true)
        {
            anim.SetAnimTrigger("Shoot");
            OnDamage();
            CountAmmo--;
            if (CountAmmo <= 0)
                yield return ReloadTimer();
            yield return new WaitForSeconds(3);  
        }
    }

    private IEnumerator ReloadTimer()
    {
        anim.SetAnimBool("Reload", true);
        yield return new WaitForSeconds(2);
        anim.SetAnimBool("Reload", false);
        CountAmmo = MaxCount;
    }


При таком коде получается что включается анимация перезарядки башни, но башня продолжает стрелять без анимации, а анимация перезарядки вечная потому что не меняется параметр Reload на false. Вроде все правильно написано, а работать не хочет не в какую. Как можно сделать, чтоб корутина ждала пока не выполнится корутина внутри?
MrDmitry
UNITрон
 
Сообщения: 223
Зарегистрирован: 05 авг 2017, 17:21

Re: Ожидание выполнения корутины

Сообщение waruiyume 30 мар 2023, 22:45

yield return StartCoroutine(ReloadTimer());
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Ожидание выполнения корутины

Сообщение MrDmitry 31 мар 2023, 07:48

Да StartCorutine я забыл написать. Но все равно проскакивает ((

Синтаксис:
Используется csharp
    private IEnumerator DelayShoot()
    {
        while (true)
        {
            Debug.Log(Character.name + " Shoot");
            anim.SetAnimTrigger("Shoot");
            OnDamage();
            CountAmmo--;
            if (CountAmmo <= 0)
            {
                Debug.Log(CountAmmo);
                yield return StartCoroutine(ReloadTimer());
            }
            yield return new WaitForSeconds(Character.DelaySpeed);  
        }
    }

    private IEnumerator ReloadTimer()
    {
        anim.SetAnimBool("Reload", true);
        Debug.Log(Character.name + "Reload true");
        yield return new WaitForSeconds(Character.ReloadTime + anim.GetAnimCurLength());
        Debug.Log(Character.name + "Reload false");
        anim.SetAnimBool("Reload", false);
        CountAmmo = MaxCount;
    }


Расставил вывод в консоль. Получаю после выстрела, переход в перезарядку и параллельное выполнение DelayShoot, CountAmmo идут в минус пока мобики не кончатся. То есть DelayShoot не ждет завершение ReloadTimer
MrDmitry
UNITрон
 
Сообщения: 223
Зарегистрирован: 05 авг 2017, 17:21

Re: Ожидание выполнения корутины

Сообщение 1max1 31 мар 2023, 08:47

Есть вероятность что ты запускаешь DelayShoot несколько раз вместо 1.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Ожидание выполнения корутины

Сообщение MrDmitry 31 мар 2023, 10:40

Да спасибо, когда башня, после убийства мобика переключалась на другого, она сбрасывала все переменные и собственно проходила все проверки чтоб вновь вызвать метод, вызывающий корутину DelayShoot.
MrDmitry
UNITрон
 
Сообщения: 223
Зарегистрирован: 05 авг 2017, 17:21


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12