在unity c#中使用委托的多个实例

问题描述 投票:0回答:1

我在名为 BattleManager 的脚本上创建了一个委托,以在回合结束时处理方法。

一切似乎都工作得很好,除非同一对象类的多个实例添加到延迟中。只有添加到委托的最后一个方法才有效。

Battle 经理有这样的委托:

public delegate IEnumerator OnRoundEnd();
public OnRoundEnd onRoundEnd;

我有一个 Effect 类,它添加到 onRoundEnd 委托中。 我有 3 个具有 Effect 类的对象,当它们添加到委托时,只有最后一个有效。 添加到 onRoundEnd 的其他对象可以正常工作,除非它们是相同类型。 我还没有找到任何解决这个问题的方法

在 Effect 类上我添加这样的方法

public virtual void Init()
{
    battleManager.onRoundEnd += OnRoundEnd;
}
c# unity-game-engine delegates
1个回答
0
投票

你的

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);
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.