一整套完整可扩展的伤害计算公式体系,涵盖:

  • 普攻与技能伤害
  • 暴击与非暴击
  • 招架与非招架
  • 各类伤害、治疗、加成与减免
  • 支持属性比例调节与平衡参数

🎯 一、主要参与属性

属性名 英文代号 说明
攻击 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 中挂到角色身上测试实际战斗效果。