feat: wire BossPhaseComp into monster load/destroy

This commit is contained in:
panFD
2026-10-07 15:39:25 +08:00
parent 8176ef098e
commit d5158cde52

View File

@@ -10,6 +10,9 @@ import { MoveComp } from "./MoveComp";
import { GameEvent } from "../common/config/GameEvent"; import { GameEvent } from "../common/config/GameEvent";
import { SkillTriggerType, HType } from "../common/config/heroSet"; import { SkillTriggerType, HType } from "../common/config/heroSet";
import { SkillTriggerHelper } from "./SkillTriggerHelper"; import { SkillTriggerHelper } from "./SkillTriggerHelper";
import { BossPhaseSet } from "../common/config/BossPhaseSet";
import { BossPhaseComp } from "./BossPhaseComp";
import { mLogger } from "../common/Logger";
/** 怪物实体:负责怪物对象池复用、属性初始化、入场动画与回收 */ /** 怪物实体:负责怪物对象池复用、属性初始化、入场动画与回收 */
@ecs.register(`Monster`) @ecs.register(`Monster`)
export class Monster extends ecs.Entity { export class Monster extends ecs.Entity {
@@ -122,6 +125,10 @@ export class Monster extends ecs.Entity {
} }
} }
// 阶段组件显式移除:触发 reset 清空状态并回组件池(ECS 组件无自动销毁钩子)
if (this.has(BossPhaseComp)) {
this.remove(BossPhaseComp);
}
// 手动移除组件,避免 ecs 引用滞留 // 手动移除组件,避免 ecs 引用滞留
this.remove(HeroViewComp); this.remove(HeroViewComp);
this.remove(HeroAttrsComp); this.remove(HeroAttrsComp);
@@ -134,7 +141,7 @@ export class Monster extends ecs.Entity {
* 2) 初始化表现、属性、技能与阵营 * 2) 初始化表现、属性、技能与阵营
* 3) 播放下落入场并在落地后启用碰撞与移动 * 3) 播放下落入场并在落地后启用碰撞与移动
*/ */
load(pos: Vec3 = Vec3.ZERO, scale: number = 1, uuid: number = 1001, is_boss: boolean = false, dropToY: number = pos.y, mon_lv: number = 1, laneIndex: number = 0) { load(pos: Vec3 = Vec3.ZERO, scale: number = 1, uuid: number = 1001, is_boss: boolean = false, dropToY: number = pos.y, mon_lv: number = 1, laneIndex: number = 0, phase_plan_id: number = 0) {
// 怪物默认朝左,表现缩放固定为负向 // 怪物默认朝左,表现缩放固定为负向
scale = -1 scale = -1
// 当前怪物尺寸固定,保留变量便于后续扩展 // 当前怪物尺寸固定,保留变量便于后续扩展
@@ -264,6 +271,19 @@ export class Monster extends ecs.Entity {
// 缓存技能射程等派生数据,减少战斗帧内重复计算 // 缓存技能射程等派生数据,减少战斗帧内重复计算
model.updateSkillDistanceCache(); model.updateSkillDistanceCache();
// Boss 阶段初始化:P1 = 基线技能,仅挂标记组件并记录方案(方案缺失则退化为单阶段 Boss)
if (is_boss && phase_plan_id > 0) {
const plan = BossPhaseSet[phase_plan_id];
if (plan) {
const phase = this.add(BossPhaseComp);
phase.plan_id = phase_plan_id;
phase.index = 0;
} else {
// 配置兜底:引用了不存在的方案,退化为单阶段并告警(不阻断战斗)
mLogger.warn(true, "BossPhase", `阶段方案 ${phase_plan_id} 未在 BossPhaseSet 中定义,Boss 按单阶段战斗`);
}
}
// 注册视图组件并重置对象池复用状态 // 注册视图组件并重置对象池复用状态
this.add(view); this.add(view);
view.init(); view.init();
@@ -356,6 +376,9 @@ export class Monster extends ecs.Entity {
/** 重置入口:复用 destroy 的释放流程 */ /** 重置入口:复用 destroy 的释放流程 */
reset() { reset() {
if (this.has(BossPhaseComp)) {
this.remove(BossPhaseComp);
}
super.destroy(); super.destroy();
} }