Files
heros/assets/script/game/hero/BuffSystem_Guide.md
2025-10-17 00:29:34 +08:00

10 KiB
Raw Blame History

BUFF 系统完整使用指南

系统概述

HeroViewComp 中的 buff 系统是一套完整的属性增强/减弱管理体系,支持:

  • 数值型 buff/debuff:固定数值增减
  • 百分比型 buff/debuff:基于基础属性的百分比增减
  • 持久型:永久生效,直到主动移除
  • 临时型:按时间递减,自动过期

架构设计

存储结构

// 数值型 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。

接口定义

BuffConfbuff 配置)

export interface BuffConf {
    buff: Attrs;      // 影响的属性
    BType: BType;     // VALUE(0)数值型 或 RATIO(1)百分比型
    buV: number;      // 增益值
    buC: number;      // 持续时间0=持久,>0=临时)
    buR: number;      // 触发概率(1-100)
}

DbuffConfdebuff 配置)

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() 中自动调用)

示例

// 自动调用,无需手动调用
heroView.initBuffsDebuffs();

2. 添加 Buff

addBuff(buffConf: BuffConf): void

作用:添加 buff 效果

参数

  • buffConf: BuffConf 对象

自动行为

  • 根据 BType 和 buC 自动分类存储
  • 立即重新计算 Attrs

示例

// 添加数值型持久 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 降低闪避

示例

// 眩晕:持久型,无数值影响
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

示例

// 移除持久 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: 是否移除临时型

返回值:是否成功移除

示例

// 移除持久眩晕
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 总值

示例

const apBuff = heroView.getBuffValue(Attrs.AP);
console.log("攻击力 buff 总和:", apBuff);

9. 查询 Debuff 状态

getDebuffValue(debuffType: DBuff): number

作用:获取指定 debuff 类型的所有 debuff 总值

返回值debuff 总值

示例

const stunDebuff = heroView.getDebuffValue(DBuff.STUN);
console.log("眩晕等级:", stunDebuff);

10. 检查 Debuff 存在

hasDebuff(debuffType: DBuff): boolean

作用:检查是否存在指定的 debuff

返回值:是否存在

示例

if (heroView.hasDebuff(DBuff.STUN)) {
    console.log("角色已眩晕");
}

完整使用示例

场景 1技能施加 Buff

// 在 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英雄初始化

// 在 Hero.ts 中(已自动调用)
hero_init(uuid: number, node: Node) {
    var hv = node.getComponent(HeroViewComp)!;
    let hero = HeroInfo[uuid];
    
    // ... 其他初始化 ...
    
    // 自动调用初始化 buff
    hv.initBuffsDebuffs();
    return hv;
}

场景 3属性查询

// 获取最终计算后的属性值
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

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 类型 自动处理持久/临时管理 自动处理属性计算 编译检查确保类型安全