如何正确实现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
相关产品推荐
相关产品推荐

