我在名为 BattleManager 的脚本上创建了一个委托,以在回合结束时处理方法。
一切似乎都工作得很好,除非同一对象类的多个实例添加到延迟中。只有添加到委托的最后一个方法才有效。
Battle 经理有这样的委托:
public delegate IEnumerator OnRoundEnd();
public OnRoundEnd onRoundEnd;
我有一个 Effect 类,它添加到 onRoundEnd 委托中。 我有 3 个具有 Effect 类的对象,当它们添加到委托时,只有最后一个有效。 添加到 onRoundEnd 的其他对象可以正常工作,除非它们是相同类型。 我还没有找到任何解决这个问题的方法
在 Effect 类上我添加这样的方法
public virtual void Init()
{
battleManager.onRoundEnd += OnRoundEnd;
}
你的
public delegate IEnumerator OnRoundEnd();
基本上就是使用
Func<IEnumerator>
。
您期待一个返回值 - 一个返回值!
将多个
void
返回链接在一起(又名 Action
)是有效的,因为没有特定的返回。
对于其他任何事情,最后的“订阅”基本上都会推翻返回值。
您可以使用代替进行简单的测试
delegate int OnRoundEnd();
public OnRoundEnd onRoundEnd;
然后做
onRoundEnd += () => 1;
onRoundEnd += () => 2;
当然现在如果你执行这个
var result = onRoundEnd;
您现在期望
result
的值是多少?
=>
IEnumerator
也会发生同样的情况,所以你最终只能得到最后一个。
如前所述,我不完全了解您到底如何消费
onRoundEnd
,但坚持使用例如可能会更容易。 a Queue
- 假设每个效果只能执行一次:
private Queue<IEnumerator> onRoundEnd;
public void ScheduleForRoundEnd(IEnumerator routine)
{
onRoundEnd.Enqueue(routine);
}
然后稍后
private IEnumerator OnRoundEnd()
{
while(onRoundEnd.Count > 0)
{
var routine = onRoundEnd.Dequeue();
yield return routine;
}
}
并在你的 init 中执行
battleManager.ScheduleForRoundEnd(OnRoundEnd);