# BUFF 系统完整使用指南 ## 系统概述 HeroViewComp 中的 buff 系统是一套完整的属性增强/减弱管理体系,支持: - **数值型 buff/debuff**:固定数值增减 - **百分比型 buff/debuff**:基于基础属性的百分比增减 - **持久型**:永久生效,直到主动移除 - **临时型**:按时间递减,自动过期 ## 架构设计 ### 存储结构 ```typescript // 数值型 buff V_BUFF: BuffConf[] // 持久型 V_BUFFS: BuffConf[] // 临时型(含 remainTime) // 百分比型 buff R_BUFF: BuffConf[] // 持久型 R_BUFFS: BuffConf[] // 临时型(含 remainTime) // 数值型 debuff V_DBUFF: DbuffConf[] // 持久型 V_DBUFFS: DbuffConf[]// 临时型(含 remainTime) // 百分比型 debuff R_DBUFF: DbuffConf[] // 持久型 R_DBUFFS: DbuffConf[]// 临时型(含 remainTime) ``` ### 初始值属性 以下属性拥有初始值,百分比 buff 基于这些值计算: - `base_hp`: 基础血量 - `base_mp`: 基础魔法值 - `base_def`: 基础防御 - `base_ap`: 基础攻击力 - `base_map`: 基础魔法攻击 其他属性(CRITICAL, DODGE, AS 等)默认值为 0。 ## 接口定义 ### BuffConf(buff 配置) ```typescript export interface BuffConf { buff: Attrs; // 影响的属性 BType: BType; // VALUE(0)数值型 或 RATIO(1)百分比型 buV: number; // 增益值 buC: number; // 持续时间(0=持久,>0=临时) buR: number; // 触发概率(1-100) } ``` ### DbuffConf(debuff 配置) ```typescript export interface DbuffConf { debuff: DBuff; // debuff 类型 BType: BType; // VALUE(0)数值型 或 RATIO(1)百分比型 dev: number; // 减益值 deC: number; // 持续时间(0=持久,>0=临时) deR: number; // 触发概率(1-100) } ``` ## API 文档 ### 1. 初始化系统 #### `initBuffsDebuffs(): void` **作用**:从 HeroInfo 读取英雄初始配置,初始化 buff/debuff 系统 **调用时机**:英雄加载时(在 Hero.hero_init() 中自动调用) **示例**: ```typescript // 自动调用,无需手动调用 heroView.initBuffsDebuffs(); ``` --- ### 2. 添加 Buff #### `addBuff(buffConf: BuffConf): void` **作用**:添加 buff 效果 **参数**: - `buffConf`: BuffConf 对象 **自动行为**: - 根据 BType 和 buC 自动分类存储 - 立即重新计算 Attrs **示例**: ```typescript // 添加数值型持久 buff:+10 攻击力 heroView.addBuff({ buff: Attrs.AP, BType: BType.VALUE, buV: 10, buC: 0, // 0 表示持久 buR: 100 }); // 添加百分比型临时 buff:+20% 防御,持续 5 秒 heroView.addBuff({ buff: Attrs.DEF, BType: BType.RATIO, buV: 20, buC: 5, // 5 秒后过期 buR: 100 }); // 从技能配置添加(来自 SkillSet) const skillBuff: BuffConf = { buff: Attrs.CRITICAL, BType: BType.VALUE, buV: 25, // +25% 暴击率 buC: 3, // 持续 3 秒 buR: 100 }; heroView.addBuff(skillBuff); ``` --- ### 3. 添加 Debuff #### `addDebuff(dbuffConf: DbuffConf): void` **作用**:添加 debuff 效果 **参数**: - `dbuffConf`: DbuffConf 对象 **自动行为**: - DBuff 类型自动映射到对应 Attrs - 根据 BType 和 deC 自动分类存储 - 立即重新计算 Attrs **DBuff 映射表**: | DBuff 类型 | 对应 Attrs | 说明 | |-----------|-----------|------| | STUN | CON_RES | 眩晕 | | SLOW | AS | 减速(攻击速度) | | FROST | ICE_RES | 冰冻抗性 | | BURN | DEF | 易伤(降低防御) | | DEAS | AS | 减少 CD(攻击速度) | | DEHP | HP_MAX | 降低最大血量 | | DEAP | AP | 降低攻击力 | | DEMGP | MAP | 降低魔法攻击力 | | BACK | KNOCKBACK | 击退概率 | | CRITICAL | CRITICAL | 降低暴击率 | | CRIT_DAMAGE | CRITICAL_DMG | 降低暴击伤害 | | DODGE | DODGE | 降低闪避 | **示例**: ```typescript // 眩晕:持久型,无数值影响 heroView.addDebuff({ debuff: DBuff.STUN, BType: BType.VALUE, dev: 0, deC: 0, // 持久 deR: 100 }); // 减速:临时型,-30% 攻击速度,持续 3 秒 heroView.addDebuff({ debuff: DBuff.SLOW, BType: BType.RATIO, dev: 30, // 减少 30% deC: 3, // 3 秒后过期 deR: 100 }); // 易伤:数值型,-5 防御,持久 heroView.addDebuff({ debuff: DBuff.BURN, BType: BType.VALUE, dev: 5, deC: 0, deR: 100 }); ``` --- ### 4. 移除 Buff #### `removeBuff(buffType: Attrs, isTemporary?: boolean): boolean` **作用**:移除指定属性的 buff **参数**: - `buffType`: 属性类型 - `isTemporary`: 是否移除临时型(默认 false=持久型) **返回值**:是否成功移除 **自动行为**: - 移除成功后自动重新计算 Attrs **示例**: ```typescript // 移除持久 AP buff heroView.removeBuff(Attrs.AP, false); // 移除临时 DEF buff heroView.removeBuff(Attrs.DEF, true); ``` --- ### 5. 移除 Debuff #### `removeDebuff(debuffType: DBuff, isTemporary?: boolean): boolean` **作用**:移除指定类型的 debuff **参数**: - `debuffType`: DBuff 类型 - `isTemporary`: 是否移除临时型 **返回值**:是否成功移除 **示例**: ```typescript // 移除持久眩晕 heroView.removeDebuff(DBuff.STUN, false); // 移除临时减速 heroView.removeDebuff(DBuff.SLOW, true); ``` --- ### 6. 属性重新计算 #### `recalculateAttrs(): void` **作用**:重新计算所有角色属性 **调用时机**: - 自动在 addBuff/addDebuff/removeBuff/removeDebuff 时调用 - 自动在临时 buff/debuff 过期时调用 - 无需手动调用 **计算流程**: 1. 重置为基础值 2. 应用数值型 buff(持久 + 临时) 3. 应用百分比型 buff(持久 + 临时) 4. 应用数值型 debuff(持久 + 临时) 5. 应用百分比型 debuff(持久 + 临时) 6. Clamp 关键属性(防止负数) **百分比计算示例**: ``` 基础攻击力: 100 +20% buff: 100 * 1.2 = 120 -10% debuff: 120 * 0.9 = 108 ``` --- ### 7. 更新临时效果 #### `updateTemporaryBuffsDebuffs(dt: number): void` **作用**:更新临时 buff/debuff 的剩余时间 **参数**: - `dt`: 时间增量(秒) **调用时机**: - 自动在 update() 中每帧调用 - 无需手动调用 **自动行为**: - 减少所有临时 buff/debuff 的 remainTime - 移除 remainTime <= 0 的效果 - 移除后自动重新计算 Attrs --- ### 8. 查询 Buff 状态 #### `getBuffValue(attrType: Attrs): number` **作用**:获取指定属性的所有 buff 总值 **返回值**:buff 总值 **示例**: ```typescript const apBuff = heroView.getBuffValue(Attrs.AP); console.log("攻击力 buff 总和:", apBuff); ``` --- ### 9. 查询 Debuff 状态 #### `getDebuffValue(debuffType: DBuff): number` **作用**:获取指定 debuff 类型的所有 debuff 总值 **返回值**:debuff 总值 **示例**: ```typescript const stunDebuff = heroView.getDebuffValue(DBuff.STUN); console.log("眩晕等级:", stunDebuff); ``` --- ### 10. 检查 Debuff 存在 #### `hasDebuff(debuffType: DBuff): boolean` **作用**:检查是否存在指定的 debuff **返回值**:是否存在 **示例**: ```typescript if (heroView.hasDebuff(DBuff.STUN)) { console.log("角色已眩晕"); } ``` --- ## 完整使用示例 ### 场景 1:技能施加 Buff ```typescript // 在 SkillEnt.ts 或相关技能脚本中 const skillConf = SkillSet[skillId]; // 遍历技能的 buff 配置 for (const buffConf of skillConf.buffs) { targetHero.HeroView.addBuff(buffConf); } // 遍历技能的 debuff 配置 for (const dbuffConf of skillConf.debuffs) { targetHero.HeroView.addDebuff(dbuffConf); } ``` ### 场景 2:英雄初始化 ```typescript // 在 Hero.ts 中(已自动调用) hero_init(uuid: number, node: Node) { var hv = node.getComponent(HeroViewComp)!; let hero = HeroInfo[uuid]; // ... 其他初始化 ... // 自动调用初始化 buff hv.initBuffsDebuffs(); return hv; } ``` ### 场景 3:属性查询 ```typescript // 获取最终计算后的属性值 const finalAP = heroView.Attrs[Attrs.AP]; const finalDEF = heroView.Attrs[Attrs.DEF]; // 获取 buff 总值 const apBuff = heroView.getBuffValue(Attrs.AP); const defBuff = heroView.getBuffValue(Attrs.DEF); // 检查 debuff 状态 if (heroView.hasDebuff(DBuff.STUN)) { // 眩晕状态下无法行动 } ``` --- ## 关键设计原则 ### 1. 兼容式修改 - 所有方法名保持不变,易于集成 - 无痛替换原有的 buff 系统 ### 2. 自动化计算 - 每次 buff 变动自动重新计算 - 无需手动更新属性 ### 3. 灵活的时间管理 - 持久型(buC=0)永久生效 - 临时型(buC>0)自动按秒递减 - 过期自动移除和重新计算 ### 4. 基础值保护 - 基础属性独立存储 - 百分比计算基于原始基础值 - 不会出现多次计算的偏差 ### 5. 属性限制 - HP_MAX, MP_MAX 最少为 1 - 百分比属性(CRITICAL, DODGE)限制在 0-100 - 防止异常数值 --- ## 常见问题 **Q: 如何区分持久和临时?** A: buC=0 是持久,buC>0 是临时(表示秒数)。 **Q: 百分比如何计算?** A: 基于基础属性乘以百分比。例:base_ap=100,+20% → 100*1.2=120 **Q: 多个相同 buff 是否叠加?** A: 会叠加。每个 addBuff 调用都会添加新条目。 **Q: 如何清除所有 buff?** A: 调用 initBuffsDebuffs() 重新初始化,或手动清空缓存数组。 --- ## 扩展与维护 ### 添加新 Buff 只需在 SkillSet.ts 的技能配置中添加即可,无需修改 HeroViewComp.ts: ```typescript buffs: [ { buff: Attrs.AP, BType: BType.VALUE, buV: 10, buC: 0, buR: 100 } ] ``` ### 添加新 Debuff 1. 在 SkillSet.ts 的 DBuff enum 中添加新类型 2. 在 HeroViewComp.ts 的 `getAttrFieldFromDebuff()` 中添加映射 3. 在技能配置中使用 详见 **BuffSystem_Extension.md** 完整扩展指南。 ### 系统的扩展特性 ✅ 支持无限数量的 buff/debuff ✅ 支持新增 Attrs 属性 ✅ 支持新增 DBuff 类型 ✅ 自动处理持久/临时管理 ✅ 自动处理属性计算 ✅ 编译检查确保类型安全