refactor(skill&atk): 优化伤害飘字与debuff图标显示逻辑

1. 调整fb-1、fb-3、fb-5、fb-6技能预制体的攻击偏移与跑动类型参数
2. 重构debuff图标映射逻辑,提取公共常量供多模块复用
3. 为DoT伤害飘字添加debuff图标显示功能,统一伤害与debuff展示流程
4. 修复tooltip预制体默认激活状态问题
This commit is contained in:
panFD
2026-08-15 14:55:51 +08:00
parent e8c6a7ca6a
commit 667ec1abfb
10 changed files with 50 additions and 28 deletions

View File

@@ -19,6 +19,7 @@ import { getMonsterGoldDrop } from "../map/RogueConfig";
import { MissionEconomy } from "../map/MissionEconomy";
import { MoveComp } from "./MoveComp";
import { buffManager, BuffApplyOverrides } from "./BuffManager";
import { DEBUFF_ICON_MAP } from "./HeroTopBarComp";
/** 最终伤害数据接口
* 用于封装一次攻击计算的所有结果数据
@@ -196,8 +197,9 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpda
// ✅ 触发视图层表现(伤害数字、受击动画、冰冻、击晕、击退)
if (targetView) {
if (isDot) {
// DoT只飘伤害数字 + 刷新血条,不播受击动画/音效/击退
targetView.showDamage(damage, isCrit);
// DoT只飘伤害数字 + 刷新血条,不播受击动画/音效/击退
// s_uuid 位置是 buffId据此激活 loss_life/hp/debuff 下的对应 debuff 图标
targetView.showDamage(damage, isCrit, DEBUFF_ICON_MAP[damageEvent.s_uuid] ?? "");
} else {
// 击退:受击默认后退,击退属性不再作为概率,而是转换为后退距离的增量
// 击退增量 = 施法者击退强化(原击退概率)- 被攻击者击退抗性 + 击退距离强化

View File

@@ -20,6 +20,15 @@ const { ccclass, property } = _decorator;
* 数据流HeroViewComp 将 HeroAttrsComp 引用传入,本组件通过 model 读取属性。
* 注意:英雄根节点下的 "shielded" 是护盾特效动画节点,由 HeroViewComp 管理,不在本组件职责内。
*/
/**
* buffId → debuff 图标节点名映射(节点名为 top.prefab / tooltip.prefab debuff 容器下的子节点名,两处同名)。
* 仅伤害类 debuff 需要图标;未映射的 buff 不显示。
* 导出供 HeroTopBarComp头顶 debuff 栏)与 HeroAtkSystemDoT 飘字图标)共用。
*/
export const DEBUFF_ICON_MAP: Record<number, string> = {
7002: "FireDamage", // 灼烧
};
@ccclass('HeroTopBarComp')
@ecs.register('HeroTopBar', false)
export class HeroTopBarComp extends CCComp {
@@ -135,14 +144,6 @@ export class HeroTopBarComp extends CCComp {
this.shieldProgressBar.node.active = shield > 0;
}
/**
* buffId → debuff 图标节点名映射(节点名为 top.prefab debuff 容器下的子节点名)。
* 仅伤害类 debuff 需要图标;未映射的 buff 不显示。
*/
private static readonly DEBUFF_ICON_MAP: Record<number, string> = {
7002: "FireDamage", // 灼烧
};
/**
* 刷新 debuff 图标显隐:按 BuffComp 中当前生效的 debuff 种类点亮对应图标。
* 由 HeroViewComp 在 dirty_buffs 脏标记时调用;与上次状态做 diff避免重复 set active。
@@ -159,7 +160,7 @@ export class HeroTopBarComp extends CCComp {
const cfg = BuffList[buffId];
// 只显示伤害类 debufftick 负值)与控制类 debuff普通 Buff 不占用 debuff 栏
if (!cfg || cfg.category === BuffCategory.Buff) continue;
const nodeName = HeroTopBarComp.DEBUFF_ICON_MAP[buffId];
const nodeName = DEBUFF_ICON_MAP[buffId];
if (nodeName) wantActive.add(nodeName);
}
}

View File

@@ -57,6 +57,7 @@ export class HeroViewComp extends CCComp {
private damageQueue: Array<{
damage: number,
isCrit: boolean,
debuffIcon: string,
}> = [];
private isProcessingDamage: boolean = false;
private damageInterval: number = 0.01; // 伤害数字显示间隔
@@ -209,7 +210,7 @@ export class HeroViewComp extends CCComp {
Tooltip.load(pos, TooltipTypes.skill, value, s_uuid, this.node, 1, this.model?.fac ?? FacSet.MON, triggerType);
}
/** 血量提示(伤害数字) */
private hp_tip(type: number = 1, value: string = "", s_uuid: number = 1001, y: number = 0) {
private hp_tip(type: number = 1, value: string = "", s_uuid: number = 1001, y: number = 0, debuffIcon: string = "") {
let x = this.node.position.x;
// 获取怪物高度的一半,定位到中心点
let halfHeight = 0;
@@ -221,7 +222,7 @@ export class HeroViewComp extends CCComp {
// 起点设为怪物中心偏下位置,使其在血条下方
let ny = this.node.position.y + halfHeight - 15;
let pos = v3(x, ny, 0);
Tooltip.load(pos, type, value, s_uuid, this.node.parent, 1, this.model?.fac ?? FacSet.MON);
Tooltip.load(pos, type, value, s_uuid, this.node.parent, 1, this.model?.fac ?? FacSet.MON, "", debuffIcon);
}
/** 护盾减免提示 */
@@ -449,11 +450,11 @@ export class HeroViewComp extends CCComp {
/** 显示伤害数字 */
showDamage(damage: number, isCrit: boolean) {
showDamage(damage: number, isCrit: boolean, debuffIcon: string = "") {
this.damageQueue.push({
damage,
isCrit,
debuffIcon,
});
}
@@ -464,7 +465,7 @@ export class HeroViewComp extends CCComp {
this.isProcessingDamage = true;
const damageInfo = this.damageQueue.shift()!;
this.showDamageImmediate(damageInfo.damage, damageInfo.isCrit);
this.showDamageImmediate(damageInfo.damage, damageInfo.isCrit, damageInfo.debuffIcon);
// 设置延时处理下一个伤
this.scheduleOnce(() => {
@@ -473,7 +474,7 @@ export class HeroViewComp extends CCComp {
}
/** 立即显示伤害效果 */
private showDamageImmediate(damage: number, isCrit: boolean) {
private showDamageImmediate(damage: number, isCrit: boolean, debuffIcon: string = "") {
if (!this.model) return;
const damageText = NumberFormatter.formatNumber(Math.max(0, Math.floor(damage)));
@@ -481,7 +482,7 @@ export class HeroViewComp extends CCComp {
if (isCrit) {
this.hp_tip(TooltipTypes.crit, damageText);
} else {
this.hp_tip(TooltipTypes.life, damageText);
this.hp_tip(TooltipTypes.life, damageText, 1001, 0, debuffIcon);
}
}
reset() {