战斗伤害计算公式
一整套完整可扩展的伤害计算公式体系,涵盖:
- 普攻与技能伤害
- 暴击与非暴击
- 招架与非招架
- 各类伤害、治疗、加成与减免
- 支持属性比例调节与平衡参数
🎯 一、主要参与属性
| 属性名 | 英文代号 | 说明 |
|---|---|---|
| 攻击 | ATK | 攻击方攻击力 |
| 防御 | DEF | 受击方防御力 |
| 生命 | HP | 当前生命值(非直接参与公式) |
| 暴击率 | CRI | 造成暴击的概率 |
| 暴击伤害 | CRIDMG | 暴击时的伤害倍率(如1.5表示150%) |
| 命中率 | HIT | 命中概率(与闪避对抗) |
| 闪避率 | EVA | 被攻击方闪避概率 |
| 暴击抵抗 | CRI_RES | 被攻击方降低对方暴击率的能力 |
| 暴伤减免 | CRIDMG_RED | 被攻击方减少暴击伤害的能力 |
| 伤害加成 | DMG_ADD | 最终伤害加成(万金油类型) |
| 治疗加成 | HEAL_ADD | 施法者对治疗类技能的加成 |
| 受到治疗加成 | HEAL_RECV_ADD | 受治疗方额外受到治疗的比例 |
| 技能伤害加成 | SKILL_DMG_ADD | 技能类攻击的额外伤害比例 |
| 招架概率 | PARRY_RATE | 被攻击方触发招架的概率 |
| 招架效果 | PARRY_EFF | 招架时减伤比例(如0.5代表50%减伤) |
| 幸运一击概率 | LUCK_RATE | 特殊“幸运一击”触发概率,可视为额外暴击或特殊效果 |
⚔️ 二、伤害计算主流程
以一次攻击为例:
1. 命中判定
2. 招架判定
3. 暴击判定
4. 计算基础伤害
5. 应用各类加成与减免
6. 应用招架/暴击等特殊修正
7. 应用最终防御修正与上下限限制
🧮 三、公式设计
1️⃣ 命中判定
命中概率 = HIT / (HIT + EVA)
是否命中 = 随机() < 命中概率
如果未命中 → 伤害 = 0,结束。
2️⃣ 招架判定
是否招架 = 随机() < PARRY_RATE
如果招架成功 → 后续计算伤害 × (1 - PARRY_EFF)
3️⃣ 暴击判定
真实暴击率 = max(0, CRI - CRI_RES)
是否暴击 = 随机() < 真实暴击率
4️⃣ 基础伤害计算(物理类)
基础伤害 = (ATK^2) / (ATK + DEF) * 技能系数
- 这个形式(平方比)可以保证攻防差距不爆炸。
- “技能系数”通常来自技能配置(如普通攻击 1.0,技能 2.5)。
5️⃣ 技能与通用加成
伤害倍率 = 1 + DMG_ADD + SKILL_DMG_ADD
乘到基础伤害上。
6️⃣ 暴击修正
if (是否暴击)
暴击系数 = (CRIDMG - CRIDMG_RED)
else
暴击系数 = 1
7️⃣ 招架修正
if (是否招架)
招架系数 = 1 - PARRY_EFF
else
招架系数 = 1
8️⃣ 幸运一击修正(可选)
if (随机() < LUCK_RATE)
幸运系数 = 1.5 ~ 2.0 // 可配置
else
幸运系数 = 1
9️⃣ 最终伤害公式
最终伤害 = 基础伤害 × 伤害倍率 × 暴击系数 × 招架系数 × 幸运系数
再限制:
最终伤害 = max(1, 最终伤害)
💚 四、治疗类公式
1️⃣ 普通治疗技能
治疗量 = (施法者.ATK * 技能系数) × (1 + HEAL_ADD) × (1 + 目标.HEAL_RECV_ADD)
2️⃣ 暴击治疗(可选规则)
如果随机() < (CRI - CRI_RES)
治疗量 ×= (CRIDMG - CRIDMG_RED)
🔧 五、完整伪代码实现示例
float CalculateDamage(Character attacker, Character defender, Skill skill)
{
// 命中判定
float hitChance = attacker.HIT / (attacker.HIT + defender.EVA);
if (Random.value > hitChance)
return 0f; // Miss
// 招架
bool parry = Random.value < defender.PARRY_RATE;
float parryFactor = parry ? (1f - defender.PARRY_EFF) : 1f;
// 暴击
float realCritRate = Mathf.Max(0, attacker.CRI - defender.CRI_RES);
bool crit = Random.value < realCritRate;
float critFactor = crit ? (attacker.CRIDMG - defender.CRIDMG_RED) : 1f;
// 幸运一击
bool lucky = Random.value < attacker.LUCK_RATE;
float luckyFactor = lucky ? 1.5f : 1f;
// 基础伤害
float baseDamage = (attacker.ATK * attacker.ATK) / (attacker.ATK + defender.DEF);
baseDamage *= skill.DamageScale; // 技能系数
// 各类加成
float totalFactor = (1 + attacker.DMG_ADD + skill.SkillDamageAdd) * parryFactor * critFactor * luckyFactor;
// 最终伤害
float finalDamage = baseDamage * totalFactor;
return Mathf.Max(1, finalDamage);
}
⚙️ 六、公式调优建议
| 调整点 | 建议 |
|---|---|
| 攻防差异太大 | 用 (ATK^2)/(ATK+DEF) 替代 ATK-DEF 模式 |
| 暴击过强 | 调整 CRIDMG 默认值从 2.0 → 1.5 |
| 招架过弱 | 增加“反击”效果(例如招架后50%概率反击) |
| 技能差异太小 | 使用技能系数 0.8~3.0 区间 |
| 防御成长太快 | 改为 (ATK / (DEF + 常数)) 结构 |
是否希望我帮你把这套公式整理成一份可配置的 Excel 表 + JSON + Unity 脚本读取模板?
那样你可以直接在 Unity 中挂到角色身上测试实际战斗效果。