我有一个统一的协程:
IEnumerator DoActionUponReachingRangeCoroutine(Range range, Delegate action, params object[] args)
{
yield return new WaitUntil(() => range.isPlayerInRange);
action.DynamicInvoke(args);
yield return null;
}
如您所见,当满足 range.IsPlayerInRange 条件时,它可以执行一些操作。我想做完全相同的事情,但每次调用此方法时都提供我自己的条件,而不是使用 isPlayerInRange 硬编码。 我是否只提供一个委托而不是范围?
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>
回调来避免捕获上下文的方法,但是......这是一个更高级的场景。