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

Unity中减速敌人协程堆叠导致速度值丢失的技术问题求助

解决敌人减速协程堆叠与速度丢失问题

问题根源

原代码存在两个核心问题:

  • 直接修改enemyMovementSpeed且未保留原始值,协程堆叠触发时会反复减半速度,恢复时无法回到真正的初始移动速度;
  • isFrozen变量逻辑混乱,不仅没有效阻止协程堆叠,反而导致状态切换出错。

修复方案(实现寒冰射手式减速效果)

下面的代码会保存原始移动速度,通过跟踪协程实例来实现「每次命中减速弹就重置3秒减速时长」的效果,彻底避免速度丢失和协程堆叠问题:

private float originalMovementSpeed;
private Coroutine currentSlowCoroutine; // 跟踪当前运行的减速协程

private void Awake()
{
    // 提前保存敌人初始移动速度,后续所有减速/恢复都基于这个原始值
    originalMovementSpeed = enemyMovementSpeed;
}

private void OnTriggerEnter2D(Collider2D collision)
{
    // Unity推荐用CompareTag替代直接字符串比较,性能更好且防拼写错误
    if (collision.CompareTag("slowProjectile"))
    {
        // 如果当前敌人正处于减速状态,先停止旧的协程(重置减速计时)
        if (currentSlowCoroutine != null)
        {
            StopCoroutine(currentSlowCoroutine);
        }
        // 启动新的减速协程并记录实例
        currentSlowCoroutine = StartCoroutine(SlowEnemyCoroutine());
    }
}

IEnumerator SlowEnemyCoroutine()
{
    // 应用减速:移速设为原始值的一半,角色变蓝
    enemyMovementSpeed = originalMovementSpeed * 0.5f;
    GetComponent<SpriteRenderer>().color = Color.blue;

    // 持续减速3秒(和需求的减速时长匹配)
    yield return new WaitForSeconds(3f);

    // 恢复原始状态:移速回到初始值,颜色变白
    enemyMovementSpeed = originalMovementSpeed;
    GetComponent<SpriteRenderer>().color = Color.white;

    // 协程结束后清空跟踪变量,标记减速状态结束
    currentSlowCoroutine = null;
}

关键优化点

  • 保留原始速度:用originalMovementSpeed在初始化阶段记录敌人初始移速,彻底避免多次修改导致的数值混乱;
  • 协程实例跟踪:通过currentSlowCoroutine变量控制协程的启停,实现「再次命中减速弹就刷新3秒减速时间」的效果,和《植物大战僵尸》寒冰射手的逻辑完全一致;
  • 简化状态管理:移除了逻辑混乱的isFrozen变量,直接通过协程实例是否存在判断减速状态,代码逻辑更清晰;
  • 性能优化:使用CompareTag替代直接的tag ==判断,减少不必要的字符串开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 04:25:40