7.4 KiB
7.4 KiB
Buff 系统实现总结
修改的文件
1. HeroViewComp.ts (主要实现)
导入部分更新
import { ..., BType, BuffConf, DbuffConf } from "../common/config/SkillSet";
新增方法(精简版)
| 方法名 | 功能 | 访问修饰符 |
|---|---|---|
initBuffsDebuffs() |
初始化 buff/debuff 系统 | public |
addBuff(buffConf) |
添加 buff 效果 | public |
addDebuff(dbuffConf) |
添加 debuff 效果 | public |
getAttrFieldFromDebuff() |
获取 debuff 对应属性 | private |
recalculateAttrs() |
重新计算属性 | public |
applyValueBuffs() |
应用数值型 buff | private |
applyRatioBuffs() |
应用百分比型 buff | private |
applyValueDebuffs() |
应用数值型 debuff | private |
applyRatioDebuffs() |
应用百分比型 debuff | private |
clampAttrs() |
限制属性值范围 | private |
updateTemporaryBuffsDebuffs() |
更新临时 buff/debuff | public |
删除的方法(持久性不需要移除):
removeBuff()removeDebuff()getBuffValue()getDebuffValue()hasDebuff()
关键特性
- 百分比属性限制在 0-85%(CRITICAL, DODGE, HIT)
- 持久型 buff/debuff 永久生效,不支持移除
- 临时型自动过期,自动重新计算
update() 方法更新
添加了对 updateTemporaryBuffsDebuffs(dt) 的调用,以处理临时 buff/debuff 的过期。
2. Hero.ts (初始化调用)
hero_init() 方法更新
在方法末尾添加了 hv.initBuffsDebuffs() 调用,在英雄初始化时自动初始化 buff 系统。
核心设计
存储结构
buffPerm/buffTemp Buff 缓存(持久/临时)
├─ value 数值型
└─ ratio 百分比型
debuffPerm/debuffTemp Debuff 缓存(持久/临时)
├─ value 数值型
└─ ratio 百分比型
优势
- 更清晰:按持久/临时和数值/百分比二维组织
- 更简洁:从 8 个数组变为 4 个对象
- 更易扩展:新增字段时直接添加到对应对象
- 更易查询:通过对象结构自文档化
设计原则
-
持久性不可移除
- 持久型 buff/debuff 一旦添加就永久生效
- 无需提供移除接口,简化代码
-
临时自动过期
- 临时型自动在每帧更新时递减
- 过期自动移除和重新计算属性
-
百分比上限 85%
- 防止百分比属性过高导致游戏失衡
- 暴击率、闪避、命中等限制在 0-85%
计算流程
1. 重置为基础值 (base_hp, base_mp, base_def, base_ap, base_map)
↓
2. 应用数值型 buff (V_BUFF + V_BUFFS)
↓
3. 应用百分比型 buff (R_BUFF + R_BUFFS)
↓
4. 应用数值型 debuff (V_DBUFF + V_DBUFFS)
↓
5. 应用百分比型 debuff (R_DBUFF + R_DBUFFS)
↓
6. 限制属性值范围 (clampAttrs)
- HP_MAX, MP_MAX 最少 1
- 百分比属性限制 0-85%
集成要点
1. 技能系统集成
在技能释放时调用:
// 应用技能的 buff
for (const buffConf of skillConf.buffs) {
targetHeroView.addBuff(buffConf);
}
// 应用技能的 debuff
for (const dbuffConf of skillConf.debuffs) {
targetHeroView.addDebuff(dbuffConf);
}
2. SkillSet 配置
SkillSet 中的每个技能可配置 buff 和 debuff:
{
uuid: 6001,
// ... 其他配置 ...
buffs: [
{ buff: Attrs.AP, BType: BType.VALUE, buV: 10, buC: 0, buR: 100 }
],
debuffs: [
{ debuff: DBuff.STUN, BType: BType.VALUE, dev: 0, deC: 3, deR: 50 }
]
}
3. HeroInfo 配置
HeroInfo 中可配置英雄初始 buff/debuff:
5001: {
// ... 其他配置 ...
buff: [
{ buff: Attrs.CRITICAL, BType: BType.VALUE, buV: 15, buC: 0, buR: 100 }
],
debuff: []
}
属性初始值保护
有初始值的属性(基础属性):
base_hp: 基础血量base_mp: 基础魔法值base_def: 基础防御base_ap: 基础攻击力base_map: 基础魔法攻击力
百分比 buff/debuff 基于这些初始值计算,确保多次计算不会产生偏差。
无初始值属性(默认为 0,限制 0-85%):
- CRITICAL, DODGE, HIT, WFUNY, AS, REFLICT, LIFESTEAL, KNOCKBACK, CON_RES, ICE_RES, FIRE_RES, WIND_RES, ICE_POWER, FIRE_POWER, WIND_POWER, SHIELD_UP, BUFF_UP, DBUFF_UP, DIS
DBuff 到 Attrs 的映射
const debuffAttrMap = {
[DBuff.STUN]: Attrs.CON_RES, // 眩晕 -> 控制抗性
[DBuff.SLOW]: Attrs.AS, // 减速 -> 攻击速度
[DBuff.FROST]: Attrs.ICE_RES, // 冰冻 -> 冰冻抗性
[DBuff.BURN]: Attrs.DEF, // 易伤 -> 防御
[DBuff.DEAS]: Attrs.AS, // 减cd -> 攻击速度
[DBuff.DEHP]: Attrs.HP_MAX, // 减hp -> 最大生命值
[DBuff.DEAP]: Attrs.AP, // 减atk -> 攻击力
[DBuff.DEMGP]: Attrs.MAP, // 减魔法 -> 魔法攻击力
[DBuff.BACK]: Attrs.KNOCKBACK, // 击退 -> 击退概率
[DBuff.CRITICAL]: Attrs.CRITICAL, // -暴击率 -> 暴击率
[DBuff.CRIT_DAMAGE]: Attrs.CRITICAL_DMG, // -暴击伤害 -> 暴击伤害
[DBuff.DODGE]: Attrs.DODGE, // -闪避 -> 闪避
};
性能考虑
优化点
- 按需重新计算:只在 buff 变动时计算,不是每帧
- 缓存分离:分离存储持久和临时,便于处理
- 类型分组:数值型和百分比型分离,计算方式不同
缓存行为
- 临时 buff/debuff 每帧检查一次(在 update 中)
- 过期移除时批量重新计算一次
使用模板
模板 1:技能中应用 Buff
// 在 SkillEnt.ts 或 SkillConCom.ts 中
applySkillEffect(targetHero: Hero, skillId: number) {
const skillConf = SkillSet[skillId];
const heroView = targetHero.get(HeroViewComp);
// 应用所有 buff
for (const buff of skillConf.buffs) {
heroView.addBuff(buff);
}
// 应用所有 debuff
for (const debuff of skillConf.debuffs) {
heroView.addDebuff(debuff);
}
}
模板 2:查询属性值
// 获取最终计算的属性
const finalAP = heroView.Attrs[Attrs.AP];
const finalDEF = heroView.Attrs[Attrs.DEF];
兼容性说明
✅ 完全兼容
- 所有新增方法都是 public,不改变现有接口
- 自动初始化,无需修改现有代码
- 可逐步集成,不需一次性改造全部
⚠️ 注意事项
- 临时 buff/debuff 需在配置中指定持续时间
- 百分比计算基于基础值,不会重复计算
- 属性值有范围限制,防止异常
- 持久型 buff/debuff 无法移除
验证清单
- 导入 BType, BuffConf, DbuffConf
- 添加 buff/debuff 缓存字段
- 实现初始化方法
- 实现添加 buff 方法
- 实现添加 debuff 方法
- 实现属性计算方法
- 实现临时效果更新
- 在 update 中调用更新
- 在 Hero.hero_init 中调用初始化
- 编译通过,无错误
- 精简不必要的方法
- 百分比属性限制 0-85%
相关文件
- 📄 HeroViewComp.ts - 主实现文件
- 📄 Hero.ts - 初始化调用
- 📄 SkillSet.ts - BuffConf/DbuffConf 定义
- 📄 heroSet.ts - HeroInfo 定义
- 📄 BuffSystem_Guide.md - 详细使用指南
- 📄 BuffSystem_QuickRef.md - 快速参考
- 📄 BuffSystem_Implementation.md - 本文件