feat(monster&spawn): 新增飞行怪物支持,重构怪物移动与刷怪系统

抽离MonMoveComp拆分怪物移动逻辑,让MoveComp仅负责英雄移动
新增Fly和FlyBoss怪物类型,配置三层飞行轨道支持空中怪物
重写波次刷怪逻辑,移除固定5槽限制,按轨道自由排布怪物
将怪物生成上限与恢复阈值从5/3调整为50/30
优化渲染排序逻辑,为飞行怪添加持续浮动动画
移除跨波怪物属性继承,波次切换时自动清理残留怪物
This commit is contained in:
walkpan
2026-05-12 12:23:37 +08:00
parent 92db480baf
commit e7075004fe
7 changed files with 390 additions and 264 deletions

View File

@@ -7,6 +7,7 @@ import { HeroInfo } from "../common/config/heroSet";
import { HeroAttrsComp } from "./HeroAttrsComp";
import { HeroViewComp } from "./HeroViewComp";
import { MoveComp } from "./MoveComp";
import { MonMoveComp } from "./MonMoveComp";
import { GameEvent } from "../common/config/GameEvent";
/** 怪物实体:负责怪物对象池复用、属性初始化、入场动画与回收 */
@ecs.register(`Monster`)
@@ -16,7 +17,7 @@ export class Monster extends ecs.Entity {
/** 怪物表现组件引用 */
HeroView!: HeroViewComp;
/** 怪物移动组件引用 */
MonMove!: MoveComp;
MonMove!: MonMoveComp;
/** 调试开关,控制生命周期日志输出 */
private debugMode: boolean = false;
@@ -95,7 +96,7 @@ export class Monster extends ecs.Entity {
/** 注册实体必需组件:移动 + 属性 */
protected init() {
this.addComponents<ecs.Comp>(
MoveComp,
MonMoveComp,
HeroAttrsComp,
);
}
@@ -122,7 +123,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) {
load(pos: Vec3 = Vec3.ZERO,scale:number = 1,uuid:number=1001, is_boss:boolean=false, dropToY:number = pos.y,mon_lv:number=1, flyLaneIndex:number = 0) {
// 怪物默认朝左,表现缩放固定为负向
scale=-1
// 当前怪物尺寸固定,保留变量便于后续扩展
@@ -200,7 +201,7 @@ export class Monster extends ecs.Entity {
// 广播怪物加载事件,供刷怪与战斗系统联动
oops.message.dispatchEvent("monster_load",this)
// 初始化移动参数:方向、目标 X、站位基准 Y
const move = this.get(MoveComp);
const move = this.get(MonMoveComp);
move.reset();
move.direction = -1;
move.targetX = pos.x;
@@ -219,7 +220,19 @@ export class Monster extends ecs.Entity {
if (!node || !node.isValid) return;
// 落地后锁定最终位置,切换到落地完成状态
node.setPosition(pos.x, dropToY, 0);
// 如果是飞行怪,可以保持空中状态,这里依然调用 down
view.playEnd("down");
// 飞行怪加一个轻微的上下浮动动效
if (flyLaneIndex > 0) {
tween(node)
.by(1.5, { position: v3(0, 15, 0) }, { easing: "sineOut" })
.by(1.5, { position: v3(0, -15, 0) }, { easing: "sineIn" })
.union()
.repeatForever()
.start();
}
move.moving = true;
// 落地后启用怪物碰撞分组
if (collider) {