diff --git a/assets/script/game/hero/Mon.ts b/assets/script/game/hero/Mon.ts index 57c7622c..09feb028 100644 --- a/assets/script/game/hero/Mon.ts +++ b/assets/script/game/hero/Mon.ts @@ -10,6 +10,9 @@ import { MoveComp } from "./MoveComp"; import { GameEvent } from "../common/config/GameEvent"; import { SkillTriggerType, HType } from "../common/config/heroSet"; import { SkillTriggerHelper } from "./SkillTriggerHelper"; +import { BossPhaseSet } from "../common/config/BossPhaseSet"; +import { BossPhaseComp } from "./BossPhaseComp"; +import { mLogger } from "../common/Logger"; /** 怪物实体:负责怪物对象池复用、属性初始化、入场动画与回收 */ @ecs.register(`Monster`) 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 引用滞留 this.remove(HeroViewComp); this.remove(HeroAttrsComp); @@ -134,7 +141,7 @@ export class Monster extends ecs.Entity { * 2) 初始化表现、属性、技能与阵营 * 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 // 当前怪物尺寸固定,保留变量便于后续扩展 @@ -264,6 +271,19 @@ export class Monster extends ecs.Entity { // 缓存技能射程等派生数据,减少战斗帧内重复计算 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); view.init(); @@ -356,6 +376,9 @@ export class Monster extends ecs.Entity { /** 重置入口:复用 destroy 的释放流程 */ reset() { + if (this.has(BossPhaseComp)) { + this.remove(BossPhaseComp); + } super.destroy(); }