如何泛化两个逻辑相似的协程为支持布尔参数的单个通用协程
解决方案
C# 中返回IEnumerator的协程属于迭代器块,语法层面不支持ref/out参数,无法直接传入布尔变量的引用在协程内部修改。采用状态委托传递赋值逻辑的方案,可兼容所有Unity版本,将两个协程的差异点(动作状态字段、触发时精灵颜色、动作时长)抽为参数,即可完成泛化合并。
通用协程实现
private IEnumerator ActionTimer(float duration, Color triggerColor, Action<bool> setActionState) { // 进入动作状态,将对应状态布尔置为true setActionState(true); sprite.color = triggerColor; yield return new WaitForSeconds(duration); // 动作阶段结束,重置动作状态 setActionState(false); // 进入移动冷却阶段 movementCooldown = true; sprite.color = Color.green; yield return new WaitForSeconds(duration); movementCooldown = false; sprite.color = Color.white; yield return null; }
调整后的输入检测逻辑
private void Update() { if (dashing || blocking || movementCooldown) return; if (Input.GetButtonDown("Dash") & (movementX!=0||movementY!=0)) { StartCoroutine(ActionTimer( duration: dashTime, triggerColor: Color.red, setActionState: state => dashing = state )); } if (Input.GetButtonDown("Block")) { StartCoroutine(ActionTimer( duration: blockTime, triggerColor: Color.blue, setActionState: state => blocking = state )); } }
注意事项
setActionState为Action<bool>类型委托,调用时通过Lambda表达式关联到需要修改的具体布尔字段,协程内部赋值时会直接修改外部对应字段,不存在值类型拷贝导致修改不生效的问题。- 原逻辑中散落在Update里的触发颜色设置,统一收敛到协程内部作为参数传入,逻辑聚合度更高。后续新增同类动作(如闪避、弹反)时,仅需新增一行协程调用即可,无需重复编写整段协程逻辑。
- 无需通过封装布尔值为引用类型类的方式实现传参,委托方案无额外装箱开销,性能更优,代码更简洁。
内容的提问来源于stack exchange,提问作者poryphyr73
相关产品推荐
相关产品推荐

