joywayer
9120964be0
fix(enemy): 无受击/僵直动画时不再永久卡死
...
EnemyHurtState 与 EnemyStaggerState 的 Enter 在对应 Clip 为空时守卫式早退,
**同时丢掉了恢复安排**:_currentState 永远停在该态,IsControllable 恒假,
AiRuntime 的让位门永久挡住条件边求值——敌人被打一次即永久失能。
美术未接入时这影响的是大部分敌人。
TakeDamage 是分发点:霸体被破进 Stagger、否则进 Hurt,两条都可达,
所以这是两个活 bug 而非一个。EnemyKnockUpState 本就有 else 分支走
ScheduleStateRecovery,是正确范式;本次把该分支补给另外两个,并加一条
KnockUp 回归测试守住它。
时长权威没有新造:
- Hurt 接上 DamageSourceSO.HitStunDuration——该字段一路铺到 DamageInfo
却零消费者,本就是「这一击让对方僵多久」的既有权威;经 PendingHitStun
传给状态,形状与既有的 PendingLaunchDir 一致。
- Stagger 用 HitTierConfig.staggerDuration——该结构 tooltip 本就写着
「Stagger / KnockUp 参数」却只有 KnockUp 的字段,属补齐而非发明。
顺带修 ScheduleStateRecovery 不取消前一次安排的问题:两个重叠安排里较短的
会先把状态改回 Controlled,静默缩短调用方想要的时长(ReceiveParry 接线后
就会撞上)。并在 OnSpawn 清掉跨池化周期残留的协程句柄。
注:Knockback 目前零调用者,其中的 PendingHitStun 赋值今天是死代码,
但它是 public virtual 且会进 Hurt 态,不设则将来接线时会用到陈旧时长。
验证:编译 0 错;EditMode 263/263(260 + 新增 3)。
变异验证——移除两个 else 分支后恰好 Hurt/Stagger 两条测试变红、
KnockUp 回归测试保持绿,恢复后复验 263/263。
2026-07-31 09:40:47 +08:00
joywayer
50f505279d
feat(enemy): BossPhaseAbilityGate——阶段即换招池
...
按阶段启停能力组件,被禁用的招经 CanUse 自动退出选招候选,
阶段门不需要碰选招器。取代 BossSkillSO.availablePhaseIndices。
EnterPhase 先换池后广播;OnSpawn 回阶段 0(对象池复用)。
2026-07-30 13:50:34 +08:00
joywayer
64d2087adc
fix(enemy): 禁用的能力组件不再报告可用
...
CanUse 纳入 enabled。此前禁用组件仍返回 true,选招器会选中一个
StartCoroutine 必然失败的招。这也是阶段门(按阶段启停能力)的前提。
2026-07-30 13:28:23 +08:00
joywayer and Claude Opus 5
0a92d21ce1
fix(enemy): 应用 Task 3 代码审查意见
...
补上池化路径的防重复记忆重置——ResetRepeatMemory 此前文档承诺了
「对象池复用时清除」却无任何调用点,而它要取代的 BossBase.LastUsedSkillId
恰好在 OnSpawn 里有重置。放 EnemyBase.OnSpawn 以覆盖全部池化敌人。
折扣系数改为每次选招前刷新,与 attackSelectionMode 的读取时机对齐——
此前策划在播放模式下调系数无效、调模式却立即生效,容易误判为功能没生效。
默认值收敛为 EnemyAttackSelector.DefaultAntiRepeatFactor 单一常量。
测试:IneligiblePrevious 用例改用系数 0.5——原先用 0 时,把折扣错写在
eligibility 归零之前也照样通过,是个永远不会失败的测试;统计用例边界由
7σ 收紧到 5σ 使其真正验证该系数;补 ResetRepeatMemory 的确定性用例、
系数 1.0 无惩罚、三候选三条。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-07-30 13:00:28 +08:00
joywayer and Claude Opus 5
eb3f4888a4
feat(enemy): 选招器支持防重复折扣——WeightedRandomAntiRepeat
...
上一次选中的招按 EnemyStatsSO.attackAntiRepeatFactor 折扣权重(默认 0.3)。
折扣把唯一候选压到 0 时退化为 Priority 路径,不会出现敌人永不出手。
阶段切换清空防重复记忆。取代 BossBase.UseBossSkillWeighted 里的同名逻辑。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-07-30 12:43:01 +08:00
joywayer and Claude Opus 5
2a1ada4388
fix(ai): 应用 Task 1+2 代码审查意见
...
ResourceFull 未挂 BossResource 时改为显式抛——原先静默返回 false,
是 CLAUDE.md 第 6 条禁止的下游兜底,且与紧邻的 Boss facet 行为不一致。
FakeBossControl.DistanceToAnchor 不再忽略 index。测试改用 TearDown 清理
(本项目关闭了 Domain/Scene Reload,失败断言会把物体永久留在打开的场景里)。
BeginPhaseTransition 去掉死的默认参数;接口补充重入契约说明。
顺带去重:FakeAiContext 实现 IEnemyActor,删除两个测试内的本地 Ctx 副本
——一个接口成员改动要同步三份是复发性成本。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-07-30 12:31:39 +08:00
joywayer and Claude Opus 5
3665504a58
feat(ai): 新增 IBossControl facet——Boss 阶段状态经 IAiContext 供图读取
...
非 Boss 敌人访问 IAiContext.Boss 显式抛 InvalidOperationException,
不返回空对象掩盖小怪图误挂 Boss 边的错误。BossResource 补 IsFull 供图条件边判定。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-07-30 12:15:54 +08:00
joywayer
3c622a69f2
refactor(enemy): NavLinkType 迁入 INavLinkHandler 并改述为能力驱动的地形穿越;补交新脚本 .meta
2026-07-28 11:50:17 +08:00
joywayer
c041712e99
fix(test): 到达边界用例改用二进制可精确表示的值(1.25/0.25),避免浮点噪声误判
2026-07-28 11:15:16 +08:00
joywayer
668bc3500e
feat(enemy): 新增 GroundNavigator 地面直接移动导航(+7 纯函数单测)
...
补充 EditMode 测试程序集对 BaseGames.Enemies.Navigation 的引用(此前缺失,新测试无法编译)
2026-07-28 11:12:11 +08:00
joywayer
8ea919a7f1
chore(enemy): 补交 StallDetector 与其测试的 .meta
2026-07-28 11:07:06 +08:00
joywayer
5cfacf199a
feat(enemy): 新增 StallDetector 推进停滞检测(+8 单测),为收敛三处重复实现做准备
2026-07-28 11:01:01 +08:00
joywayer
b1d3c169ec
chore(enemy): 补交 EnemyBody 与其测试的 .meta
2026-07-27 12:07:46 +08:00
joywayer
b0e1ebfecc
feat(enemy): 新增 IEnemyBody 身体几何权威接口与 EnemyBody 实现(+14 纯函数单测)
2026-07-27 11:48:26 +08:00
joywayer
568b6e46c0
chore(enemy): 补交新脚本的 .meta(AbilityCategory/AttackSelectionMode/IAttackCandidate/EnemyAttackSelector+测试)
2026-07-24 14:55:17 +08:00
joywayer
04a267b69f
feat(enemy): EnemyAttackSelector 选招器(射程+冷却+LOS+着地过滤,两模式选招)+单测
2026-07-24 12:15:41 +08:00