Ведение нескольких таймеров обратного отсчета с использованием очереди - PullRequest
0 голосов
/ 26 мая 2018

Мне нужно сохранить до X (изменяемое количество) экземпляров таймеров обратного отсчета, каждый из которых добавляется пользователем, как только один из них достигает 0, он вызывает функцию, в то время как другие счетчики продолжают считать.для этого я попытался создать их очередь, но, как оказалось, я не могу изменить значение переменной итерации в foreach:

public struct Debuff
{
    public float Timer;
    public int Stack;
    public int MaxStack;
    ...
}

public Debuff Poisoned;

public void CalcDamage(...)
{
    ...
    if (Poisoned.Stack < Poisoned.MaxStack)
    {
        Poisoned.Stack++;
        PoisonStacksTimer.Enqueue(Poisoned.Timer);
        InvokeRepeating("Poisoning", 0.1F, 1F);
    }
    else
    {
        PoisonStacksTimer.Dequeue();
        PoisonStacksTimer.Enqueue(Poisoned.Timer);
    }
}

public void Poisoning()
{
    foreach(float PTimer in PoisonStacksTimer)
    {
        TakeDamage(Poisoned.DmgTranslate);
        PTimer -= Time.deltaTime; // here lies at least one of the problems
        if (PTimer <= 0)
        {
            Poisoned.Stack--;
            PoisonStacksTimer.Dequeue();
            CancelInvoke("Poisoning");
        }
    }
}

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

1 Ответ

0 голосов
/ 26 мая 2018

С головы до головы, я бы использовал сопрограммы.

Каждый раз, когда вам нужно запустить таймер, вы запускаете связанную сопрограмму, поэтому, если у вас в определенный момент, например, 4 активныхтаймеры, там будет 4 сопрограммы.

Чтобы сохранить ссылку на каждую сопрограмму, используйте List<IEnumerator>: каждый раз, когда нужно запустить таймер, добавьте новую ссылку IEnumerator и запуститесопрограммы, поэтому, когда сопрограмма заканчивается естественным образом или ее необходимо остановить, вы можете удалить эту ссылку из списка, сохраняя ссылки других живых сопрограмм в списке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...