Страница 1 из 1

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

СообщениеДобавлено: 30 мар 2023, 21:24
MrDmitry
Башня должна стрелять с задержкой между выстрелами пока есть снаряды, снаряды кончились, башня должна уйти на перезарядку. Для этого написал такой код

Синтаксис:
Используется 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. Вроде все правильно написано, а работать не хочет не в какую. Как можно сделать, чтоб корутина ждала пока не выполнится корутина внутри?

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

СообщениеДобавлено: 30 мар 2023, 22:45
waruiyume
yield return StartCoroutine(ReloadTimer());

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

СообщениеДобавлено: 31 мар 2023, 07:48
MrDmitry
Да 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

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

СообщениеДобавлено: 31 мар 2023, 08:47
1max1
Есть вероятность что ты запускаешь DelayShoot несколько раз вместо 1.

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

СообщениеДобавлено: 31 мар 2023, 10:40
MrDmitry
Да спасибо, когда башня, после убийства мобика переключалась на другого, она сбрасывала все переменные и собственно проходила все проверки чтоб вновь вызвать метод, вызывающий корутину DelayShoot.