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

如何泛化两个逻辑相似的协程为支持布尔参数的单个通用协程

解决方案

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 10:39:20