【问题标题】:Keeping several countdown timers using a queue使用队列保持多个倒数计时器
【发布时间】:2018-05-26 14:31:52
【问题描述】:

我需要保持最多 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");
        }
    }
}

还有其他方法可以在队列中使用倒数计时器吗?或者也许是实现我目标的更好方法? 这是我第一次在这里提问,所以我希望我能清楚地解释我的问题。

【问题讨论】:

  • 您是否在队列计时器计数时添加了更多内容?此外,我认为这是可能的,但可能不是实现这一目标的最佳方式。最好解释一下为什么要这样做以及它的用途,因为您最终可能会使用队列来执行此操作,只是发现这是完成此操作的最糟糕的方法。

标签: c# unity3d queue


【解决方案1】:

在我的脑海中,我会使用协程。

每次你需要启动一个定时器时,你都会启动一个关联的协程,所以如果你在特定的时刻有 4 个活跃的定时器,那么就会有 4 个协程。

为了保持对每一个协程的引用,使用List&lt;IEnumerator&gt;:每次需要启动定时器时,添加新的IEnumerator引用并启动协程,所以当协程自然结束或需要时被停止,您可以从列表中删除该引用,同时将其他活动协程的引用保留在列表中。

【讨论】:

  • 当然,你并不需要协程。拥有自己的ITimedThing 界面并存储一个列表(您自己每Update 循环更新所述列表)也可以。
猜你喜欢
  • 1970-01-01
  • 2018-05-28
  • 1970-01-01
  • 1970-01-01
  • 2020-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多