使用队列保留几个倒计时器

时间:2018-05-26 14:31:52

标签: c# unity3d queue

我需要跟上一个倒计时器的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 :(得分:2)

从头顶开始,我会使用协同程序。

每当你需要启动一个计时器时,你就会启动一个相关的协程,所以如果你在特定时刻有4个活动计时器,那么就会有4个协同程序。

为了保持对每个协程的引用,请使用List<IEnumerator>:每次需要启动计时器时,添加新的IEnumerator引用并启动协程,因此当协程结束时当然或需要停止时,您可以从列表中删除该引用,同时保留列表中其他活动协同程序的引用。