如何以正确的方式使这个 IEnumerator 通用?

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

我有一个统一的协程:

IEnumerator DoActionUponReachingRangeCoroutine(Range range, Delegate action, params object[] args)
{
    yield return new WaitUntil(() => range.isPlayerInRange);
    action.DynamicInvoke(args);
    yield return null;
}

如您所见,当满足 range.IsPlayerInRange 条件时,它可以执行一些操作。我想做完全相同的事情,但每次调用此方法时都提供我自己的条件,而不是使用 isPlayerInRange 硬编码。 我是否只提供一个委托而不是范围?

c# unity-game-engine coroutine ienumerator
1个回答
0
投票

WaitUntil
需要
Func<bool>
,所以你可以简单地传递它:

IEnumerator DoActionUponCoroutine(Func<bool> predicate, Delegate action, params object[] args)
{
    yield return new WaitUntil(predicate);
    action.DynamicInvoke(args);
    yield return null;
}

您可能还更喜欢使用

Action
进行回调,这比
DynamicInvoke
高效得多:

IEnumerator DoActionUponCoroutine(Func<bool> predicate, Action action)
{
    yield return new WaitUntil(predicate);
    action();
    yield return null;
}

还有一种使用通用

TState state
Action<TState>
回调来避免捕获上下文的方法,但是......这是一个更高级的场景。

© www.soinside.com 2019 - 2024. All rights reserved.