效果混进主逻辑
伤害、治疗、控制和属性变化如果直接写进角色或技能脚本,状态叠加、移除和复用会快速失控。
案例研究 / system-design
我把 Buff 从效果列表拆成状态效果基础设施,用配置、实例、生命周期、叠加触发、效果接口和事件反馈支撑可扩展、可追踪、可迁移的战斗状态。
项目阶段
原型
负责人
苏阿酥
协作团队
多人协作

我把 Buff 从效果列表拆成状态效果基础设施,用配置、实例、生命周期、叠加触发、效果接口和事件反馈支撑可扩展、可追踪、可迁移的战斗状态。
系统定位
状态效果基础设施,负责把 Buff / Debuff 从单次技能逻辑升级为可复用生命周期。
项目类型
Unity 2D 横版动作战斗样机,用公开结构展示配置、触发、叠加和验证口径。
关键实现
BuffData、BuffInstance、BuffManager、IBuffEffect、触发分发和旧系统桥接。
用 BuffData 承载 buffID、分类、极性、图标、颜色、持续时间、Tick、数值和叠加规则,让状态效果先成为可配置的静态规则。
用 BuffInstance 保存实例、来源、剩余时间、Tick 和层数,让多目标共享 BuffData 时不串运行时状态。
由 BuffManager 统一添加、刷新、叠层、Tick、过期、移除、查询和事件广播,让状态流转可追踪。
同类效果先按 BuffEffect 匹配,再进入刷新、延时、数值叠层、独立实例或覆盖替换等规则。
Manual、OnHit、OnAttack、Passive、OnSkillStart、OnSkillEnd 统一进入触发判断,由 Ability 或事件层决定目标。
DoT、HoT、Freeze、Slow 实现 IBuffEffect,由 BuffEffectExecutor 调度,避免生命周期主干塞满具体效果。
用 OnBuffAdded、Refreshed、Stacked、Removed 事件驱动 UI 和调试显示,并保留 LegacyBuffMapper 让旧系统平滑迁移。
先把静态规则和运行时状态分离,再处理具体效果,避免多个目标、多个来源或存档恢复时互相污染。
以 BuffEffect 判断叠加而不是 buffID,避免同一中毒、冰冻或回复因来源不同绕过刷新、延长和覆盖规则。
保留旧 EnemyBuffManager、BuffInfo 和 DisplayConfig 的兼容路径,再逐步迁移,降低重构一次性打断表现和旧内容的风险。
形成静态配置字段说明,用于证明标识、分类、极性、表现、持续时间、Tick、数值和叠加规则已经统一。
形成 BuffInstance 状态模型,用于证明剩余时间、Tick、层数、来源和实例状态不会污染静态配置。
形成添加、刷新、叠层、Tick、过期、移除和事件广播的链路说明,用于证明状态流转可定位。
形成六类叠加规则和六类触发方式的矩阵,用于证明同类匹配、施加时机和目标分发有明确口径。
形成 Poison、HealOverTime、Freeze、Ability 触发和旧系统桥接的验收清单,用于证明框架已被验证和沉淀。

结构层级
5层↑
配置 / 实例 / 管理器 / 执行器 / 效果接口。

叠加规则
6类↑
NoStack、Refresh、Duration、Value、Independent、Override。

触发方式
6类↑
Manual、OnHit、OnAttack、Passive、OnSkillStart、OnSkillEnd。

验证样例
3类↑
Poison、HealOverTime、Freeze 覆盖伤害、治疗和控制。
状态效果不是 Poison、Freeze、Slow 的效果列表,而是添加、刷新、Tick、叠加、过期和移除的可追踪规则。
只有把配置、实例、生命周期和具体效果拆开,新状态才不会持续污染角色逻辑、技能脚本和 UI 表现。
旧系统不是一次性删除对象;桥接、fallback 和阶段迁移能让重构过程仍然可调试、可回退、可验收。