用户观察到游戏中存在伤害波动现象,例如同样的武器有时造成10伤害,有时造成5伤害,想要了解具体原因。
EnemyInstance.ts中的takeDamage方法直接扣除伤害,没有防御减伤逻辑EnemyComponent.ts虽然有getDefense方法,但实际战斗中未被使用武器基础伤害 (weapons.json)
↓
WeaponBullet.calculateRuntimeStats()
↓ 应用升级加成
基础伤害 + (等级 - 1)
↓ 应用稀有度倍数
稀有度倍数 × 升级后伤害
↓ 应用技能加成
PersistentSkillManager.applyDamageBonus()
↓ 得到最终伤害
WeaponBullet.getFinalDamage()
↓
BulletHitEffect.processNormalDamage()
↓ 暴击判定
BulletHitEffect.calculateCriticalDamage()
↓ 应用到敌人
EnemyInstance.takeDamage()
WeaponBullet.ts - calculateRuntimeStats()BulletHitEffect.ts - calculateCriticalDamage()EnemyInstance.ts - takeDamage()暴击系统详情:
// BulletHitEffect.ts - calculateCriticalDamage()
private calculateCriticalDamage(baseDamage: number): { damage: number, isCritical: boolean } {
const weaponBullet = this.getComponent('WeaponBullet') as any;
if (!weaponBullet) {
// 默认暴击率10%,暴击倍数2倍
const critChance = 0.1;
const isCritical = Math.random() < critChance;
if (isCritical) {
const critDamage = baseDamage * 2;
return { damage: critDamage, isCritical: true };
}
return { damage: baseDamage, isCritical: false };
}
// 使用WeaponBullet的暴击配置
const critChance = weaponBullet.getCritChance();
const critDamage = weaponBullet.getFinalCritDamage();
const isCritical = Math.random() < critChance;
return isCritical ?
{ damage: critDamage, isCritical: true } :
{ damage: baseDamage, isCritical: false };
}
暴击机制特点:
Math.random() < critChance判定技能系统动态加成
PersistentSkillManager.applyDamageBonus()可能提供动态伤害加成武器升级状态
模拟100次攻击结果:
- 普通攻击: 92次, 伤害: 10
- 暴击攻击: 8次, 伤害: 20
- 实际暴击率: 8% (接近理论值10%)
// pea_shooter配置
{
"id": "pea_shooter",
"stats": {
"damage": 10
},
"rarity": "common",
"upgradeConfig": {
"levels": {
"1": { "damage": 10, "cost": 100 },
"2": { "damage": 11, "cost": 150 },
"3": { "damage": 12, "cost": 200 }
}
}
}
伤害波动的主要原因是暴击机制:
用户观察到的"10伤害变成5伤害"可能的解释:
禁用暴击机制
// 在BulletHitEffect.ts中修改
private calculateCriticalDamage(baseDamage: number): { damage: number, isCritical: boolean } {
return { damage: baseDamage, isCritical: false }; // 强制返回基础伤害
}
设置固定暴击率为0
const critChance = 0.0; // 将暴击率设为0
在UI中显示暴击状态
改善用户体验
平衡性调整
assets/scripts/CombatSystem/BulletEffects/BulletHitEffect.ts - 暴击计算assets/scripts/CombatSystem/WeaponBullet.ts - 伤害计算assets/scripts/EnemySystem/EnemyInstance.ts - 伤害应用assets/resources/data/weapons.json - 武器配置assets/resources/data/enemies.json - 敌人配置BulletHitEffect.calculateCriticalDamage() - 暴击判定WeaponBullet.calculateRuntimeStats() - 伤害计算WeaponBullet.getFinalDamage() - 获取最终伤害EnemyInstance.takeDamage() - 应用伤害调查完成时间: $(date) 调查结论: 伤害波动主要由暴击机制引起,敌人防御已确认不是原因。