一整套完整可扩展的伤害计算公式体系,涵盖:
普攻与技能伤害
暴击与非暴击
招架与非招架
各类伤害、治疗、加成与减免
支持属性比例调节与平衡参数
🎯 一、主要参与属性
属性名
英文代号
说明
攻击
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 中挂到角色身上测试实际战斗效果。