You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确实现Unity中支持自定义条件的泛型IEnumerator协程?

自定义条件的Unity协程实现方案

直接用委托替代range参数完全可行,而且这是最简洁的改造方式。不过更推荐用类型安全的Func<bool>委托来替代,比通用Delegate更靠谱,还能避免DynamicInvoke带来的性能损耗。

改造后的协程代码如下:

IEnumerator DoActionWhenConditionMetCoroutine(Func<bool> condition, Action<object[]> action, params object[] args)
{
    yield return new WaitUntil(condition);
    action(args);
    yield return null;
}

如果想保留原有的Delegate+DynamicInvoke写法(不推荐),也可以改成这样:

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

调用示例

原来你可能这么调用:

StartCoroutine(DoActionUponReachingRangeCoroutine(myRange, MyActionMethod, arg1, arg2));

现在可以直接传任意自定义条件,比如判断玩家距离、UI状态等:

// 条件:玩家距离小于5米
StartCoroutine(DoActionWhenConditionMetCoroutine(
    () => Vector3.Distance(PlayerTransform.position, transform.position) < 5f,
    MyActionMethod,
    arg1, arg2
));

// 条件:某个UI面板已激活
StartCoroutine(DoActionWhenConditionMetCoroutine(
    () => UIPanel.gameObject.activeSelf,
    MyUIActionMethod,
    panelArg
));

为什么用Func<bool>而不是Delegate?

  • 类型安全:编译时就能检查条件表达式是否返回布尔值,不会出现运行时类型错误
  • 性能更好:避免了DynamicInvoke的反射开销,直接调用委托更高效

内容的提问来源于stack exchange,提问作者fastbyte22

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 14:30:54