我需要跟上一个倒计时器的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");
}
}
}
还有其他方法可以在队列中使用倒计时器吗?或者更好的方法来实现我的目标? 这是我第一次在这里提问,所以我希望我能清楚地解释我的问题。
答案 0 :(得分:2)
从头顶开始,我会使用协同程序。
每当你需要启动一个计时器时,你就会启动一个相关的协程,所以如果你在特定时刻有4个活动计时器,那么就会有4个协同程序。
为了保持对每个协程的引用,请使用List<IEnumerator>
:每次需要启动计时器时,添加新的IEnumerator
引用并启动协程,因此当协程结束时当然或需要停止时,您可以从列表中删除该引用,同时保留列表中其他活动协同程序的引用。