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
相关产品推荐
相关产品推荐

