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

Unity C#中受击重置回血计时器失效问题求助

Unity回血计时器重置失效问题修复方案

原代码核心问题

  • 回血协程一旦启动就无法停止,玩家受伤后仍会持续回血
  • damaged 重置计时器的逻辑顺序错误,且状态未及时复位,导致计时器可能被持续清零
  • 多次触发StartCoroutine会启动多个并行协程,造成回血速度异常

修复后的完整代码

private Coroutine _regenCoroutine; // 保存协程实例,用于控制启停
private bool _isRegenerating; // 标记是否正在进行回血

private void HealthRegen()
{
    // 优先处理受伤逻辑:重置计时器+停止回血
    if (damaged)
    {
        timer = 0f;
        damaged = false; // 复位受伤状态,避免一直卡着重置计时器
        StopRegeneration();
        return; // 受伤时直接跳过后续计时逻辑
    }

    timer += Time.deltaTime;
   
    // 满足回血条件且未在回血时,启动协程
    if (timer > timeToHeal && !_isRegenerating) 
    {
        _regenCoroutine = StartCoroutine(HealthRegenCo());
        _isRegenerating = true;
    }
}

private void SetHealth(float value)
{
    currentHealth = Mathf.Clamp(value, 0f, 100f);
    healthbar.value = currentHealth;
    
    // 血量满时自动停止回血
    if (currentHealth >= 100f)
    {
        StopRegeneration();
    }
}

private IEnumerator HealthRegenCo()
{
    while (true)
    {
       yield return new WaitForSeconds(0.1f);
       SetHealth(currentHealth + healAmount);
       Save();
    }
}

// 统一处理停止回血的逻辑
private void StopRegeneration()
{
    if (_regenCoroutine != null)
    {
        StopCoroutine(_regenCoroutine);
        _regenCoroutine = null;
    }
    _isRegenerating = false;
    timer = 0f; // 停止回血后重置计时器,下次触发需要重新计时
}

关键修改说明

  • 新增_regenCoroutine变量:保存正在运行的协程实例,实现精准停止
  • 调整逻辑顺序:先处理受伤重置,再累加计时器,确保受伤时计时器立即清零
  • 受伤时强制停止回血:调用StopRegeneration()终止协程,避免受伤后还在回血
  • 增加_isRegenerating标记:防止重复启动多个协程,避免回血速度翻倍
  • 血量满自动停止:在SetHealth中判断满血状态,停止无效的回血协程
  • 复位damaged状态:受伤处理完成后立即复位,避免计时器被持续重置

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 19:18:19