fix(enemy): 池化复活的敌人不再带着上一条命的能力冷却
EnemyBase.OnSpawn 里 InterruptAll 那行的注释写着「重置能力冷却」, 三处都不成立: 1. EnemyAbilityRegistry.InterruptAll 有 `if (ab.IsRunning)` 门; 2. EnemyAbilityBase.Interrupt 里还有一道 `if (!_isRunning) return`; 出生时没有能力在跑,循环体一次都不执行; 3. 即便执行到,末行是 `_cooldownEndTime = Time.time + cooldown * 0.5f`—— 那是「中断后计半程冷却」的写入语义,本就不是清零。 冷却以绝对 Time.time 记时,于是上一条命的剩余冷却原样活到下一条命。 活路径是 EnemyRespawner.SpawnEnemy():敌人死亡归池、延迟复活后取出复用, 按 1.5–10 秒的冷却量级,新生的敌人有数秒出不了招。 修法是补一条真正的清除路径而非改动中断语义: EnemyAbilityBase.ResetCooldown() 把 _cooldownEndTime 清回出生态的 -1, EnemyAbilityRegistry.ResetAllCooldowns() 不看 IsRunning 逐个调用, OnSpawn 显式调用它。原 InterruptAll 保留为兜底中断,但注释改为陈述它 实际做的事——那句失真的注释正是这个缺陷藏了这么久的原因。 测试的冷却全程由生产代码写入:Execute() 启真实协程(编辑模式下跑到首个 yield 即挂起,_isRunning 留 true),再由 Interrupt() 经真实路径写冷却, 不反射直写字段,否则测到的是伪造状态而非真实时序的产物。 验证:编译 0 错 0 警;EditMode 264/264。 修复前该用例是唯一变红的一条(263/264),失败值 5.0f 恰为 cooldown(10) × 0.5,精确指向上述第 3 点。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b8c4bfbd21220fd429f7f845fee03cff
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user