From 0b579f695c73ea444c813a121065aba7bceb5a5d Mon Sep 17 00:00:00 2001 From: pan Date: Thu, 6 Aug 2026 16:52:32 +0800 Subject: [PATCH] =?UTF-8?q?refactor(map):=20=E9=87=8D=E6=9E=84=E8=A3=85?= =?UTF-8?q?=E5=A4=87=E5=8D=A1=E6=A7=BD=E7=AE=A1=E7=90=86=E4=B8=8E=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E6=8C=82=E8=BD=BD=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 移除HeroBoxComp中未使用的ebars_node属性 2. 重构EBox.load方法,支持自定义父节点并更新注释 3. 重构MissEquipComp: - 移除无用的BoxSet导入和硬编码槽位坐标 - 使用ebars_node子节点动态生成槽位 - 修改装备挂载逻辑,将装备挂载到对应ebar子节点而非直接设置位置 - 更新相关注释与日志提示 4. 调整mission.prefab的UI布局参数与绑定节点 --- assets/resources/gui/element/mission.prefab | 24 ++++---- assets/script/game/map/EBox.ts | 12 ++-- assets/script/game/map/HeroBoxComp.ts | 4 +- assets/script/game/map/MissEquipComp.ts | 65 ++++++++++----------- 4 files changed, 54 insertions(+), 51 deletions(-) diff --git a/assets/resources/gui/element/mission.prefab b/assets/resources/gui/element/mission.prefab index 7d1472a7..4ebdc100 100644 --- a/assets/resources/gui/element/mission.prefab +++ b/assets/resources/gui/element/mission.prefab @@ -1906,7 +1906,7 @@ "_lpos": { "__type__": "cc.Vec3", "x": 306.634, - "y": 651.253, + "y": 216.64, "z": 0 }, "_lrot": { @@ -2425,7 +2425,7 @@ "_left": -8.317000000000007, "_right": -6.6340000000000146, "_top": 89.63, - "_bottom": 596.253, + "_bottom": 161.64, "_horizontalCenter": 0, "_verticalCenter": 0, "_isAbsLeft": true, @@ -7013,7 +7013,7 @@ }, "_lpos": { "__type__": "cc.Vec3", - "x": -315, + "x": -310, "y": 0, "z": 0 }, @@ -7292,7 +7292,7 @@ }, "_lpos": { "__type__": "cc.Vec3", - "x": -235, + "x": -220, "y": 0, "z": 0 }, @@ -7571,7 +7571,7 @@ }, "_lpos": { "__type__": "cc.Vec3", - "x": -155, + "x": -130, "y": 0, "z": 0 }, @@ -7850,7 +7850,7 @@ }, "_lpos": { "__type__": "cc.Vec3", - "x": -75, + "x": -40, "y": 0, "z": 0 }, @@ -8129,7 +8129,7 @@ }, "_lpos": { "__type__": "cc.Vec3", - "x": 5, + "x": 50, "y": 0, "z": 0 }, @@ -8408,7 +8408,7 @@ }, "_lpos": { "__type__": "cc.Vec3", - "x": 85, + "x": 140, "y": 0, "z": 0 }, @@ -8744,11 +8744,11 @@ "height": 40 }, "_startAxis": 0, - "_paddingLeft": 5, + "_paddingLeft": 10, "_paddingRight": 0, "_paddingTop": 0, "_paddingBottom": 0, - "_spacingX": 0, + "_spacingX": 10, "_spacingY": 0, "_verticalDirection": 1, "_horizontalDirection": 0, @@ -23937,6 +23937,7 @@ "refresh_stone_num_node": { "__id__": 209 }, + "ebars_node": null, "_id": "" }, { @@ -24018,6 +24019,9 @@ "__uuid__": "66d7902d-2a85-43d5-8cbb-671cc7dbb275", "__expectedType__": "cc.Prefab" }, + "ebars_node": { + "__id__": 421 + }, "_id": "" }, { diff --git a/assets/script/game/map/EBox.ts b/assets/script/game/map/EBox.ts index e0f86582..4a076324 100644 --- a/assets/script/game/map/EBox.ts +++ b/assets/script/game/map/EBox.ts @@ -26,15 +26,17 @@ export class EBox extends ecs.Entity { /** * 加载并初始化技能盒子 - * 1) 创建节点并挂到 SKILL 层 + * 1) 创建节点并挂到 parent 下(未传时默认 SKILL 层) * 2) 初始化表现与属性数据 */ - load(uuid: number, card_lv: number, pos: Vec3, prefab: Prefab): Node { + load(uuid: number, card_lv: number, pos: Vec3, prefab: Prefab, parent?: Node): Node { let node = instantiate(prefab); - let scene = smc.map.MapView.scene; - // 统一挂到实体显示层 SKILL 节点下 - let parent = scene.entityLayer!.node!.getChildByName("SKILL"); + // 默认挂到实体显示层 SKILL 节点下 + if (!parent) { + let scene = smc.map.MapView.scene; + parent = scene.entityLayer!.node!.getChildByName("SKILL") ?? undefined; + } if (parent) { node.parent = parent; } diff --git a/assets/script/game/map/HeroBoxComp.ts b/assets/script/game/map/HeroBoxComp.ts index dd9b2785..5f9095ab 100644 --- a/assets/script/game/map/HeroBoxComp.ts +++ b/assets/script/game/map/HeroBoxComp.ts @@ -44,9 +44,7 @@ export class HeroBoxComp extends CCComp { // ======================== 编辑器绑定节点 ======================== - /** 装备图标节点 */ - @property({ type: Node }) - private ebars_node: Node = null; + /** 英雄图标节点 */ @property({ type: Node }) diff --git a/assets/script/game/map/MissEquipComp.ts b/assets/script/game/map/MissEquipComp.ts index 727b0b47..2c8cbd39 100644 --- a/assets/script/game/map/MissEquipComp.ts +++ b/assets/script/game/map/MissEquipComp.ts @@ -22,21 +22,16 @@ * - smc.map.MapView.scene.entityLayer —— 装备节点的父容器(EQUIP 节点) */ import { mLogger } from "../common/Logger"; -import { _decorator, Node, Prefab, instantiate, Vec3 } from "cc"; +import { _decorator, Node, Prefab, Vec3 } from "cc"; import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS"; import { CCComp } from "../../../../extensions/oops-plugin-framework/assets/module/common/CCComp"; import { EBox } from "./EBox"; import { oops } from "db://oops-framework/core/Oops"; import { GameEvent } from "../common/config/GameEvent"; -import { BoxSet } from "../common/config/GameSet"; const { ccclass, property } = _decorator; -/** 技能槽位数据结构 */ -interface SkillBoxSlot { - /** 该槽位的固定 X 坐标 */ - x: number; - /** 该槽位的固定 Y 坐标 */ - y: number; +/** 装备槽位占用状态 */ +interface EquipSlot { /** 是否已被占用 */ used: boolean; /** 占用该槽位的节点引用 */ @@ -47,7 +42,7 @@ interface SkillBoxSlot { * MissEquipComp —— 场上装备卡槽位管理器 * * 在战斗场景中管理已激活的装备卡显示位置。 - * 2 行 × 5 列 = 10 个槽位,不足时提示已满。 + * 最多 6 个槽位(由外部传入的 ebars_node 子节点 ebar 提供),不足时提示已满。 */ @ccclass('MissEquipComp') @ecs.register('MissEquipComp', false) @@ -68,24 +63,24 @@ export class MissEquipComp extends CCComp { return inst.slots.every(slot => slot.used); } - /** 技能卡 Prefab(在编辑器中赋值) */ + /** 装备卡 Prefab(在编辑器中赋值) */ @property({ type: Prefab }) private equip_box: Prefab = null; - /** - * 预定义的 6 个槽位坐标(单行): - */ - private slots: SkillBoxSlot[] = [ - { x: -310, y: BoxSet.GAME_LINE - 70, used: false, node: null }, - { x: -230, y: BoxSet.GAME_LINE - 70, used: false, node: null }, - { x: -150, y: BoxSet.GAME_LINE - 70, used: false, node: null }, - { x: -70, y: BoxSet.GAME_LINE - 70, used: false, node: null }, - { x: 10, y: BoxSet.GAME_LINE - 70, used: false, node: null }, - { x: 90, y: BoxSet.GAME_LINE - 70, used: false, node: null }, - ]; + + /** 装备槽位容器(子节点为 6 个 ebar,每个装备实例化为一个 ebar 的子节点) */ + @property({ type: Node }) + private ebars_node: Node = null; + + /** 槽位占用状态(与 ebars_node 子节点一一对应,最多 6 个) */ + private slots: EquipSlot[] = []; /** 注册事件监听 */ onLoad() { MissEquipComp.instance = this; + // 初始化槽位占用状态(与 ebars_node 子节点一一对应) + if (this.ebars_node) { + this.slots = this.ebars_node.children.map(() => ({ used: false, node: null })); + } oops.message.on(GameEvent.UseEquipCard, this.onUseEquipCard, this); oops.message.on(GameEvent.RemoveEquipBox, this.onRemoveEquipBox, this); } @@ -125,10 +120,12 @@ export class MissEquipComp extends CCComp { } /** - * 紧凑重排:将所有有效节点按顺序移到前置槽位。 + * 紧凑重排:将所有有效节点按顺序移到前置 ebar 槽位。 * 确保视觉上不会出现中间空洞。 */ private rearrangeSlots() { + if (!this.ebars_node || !this.ebars_node.isValid) return; + // 收集所有有效节点 const validNodes: Node[] = []; for (let i = 0; i < this.slots.length; i++) { @@ -138,13 +135,12 @@ export class MissEquipComp extends CCComp { this.slots[i].used = false; this.slots[i].node = null; } - // 按顺序重新分配 - for (let i = 0; i < validNodes.length; i++) { - if (i < this.slots.length) { - this.slots[i].used = true; - this.slots[i].node = validNodes[i]; - validNodes[i].setPosition(new Vec3(this.slots[i].x, this.slots[i].y, 0)); - } + // 按顺序重新挂载到前置 ebar + for (let i = 0; i < validNodes.length && i < this.slots.length; i++) { + this.slots[i].used = true; + this.slots[i].node = validNodes[i]; + validNodes[i].parent = this.ebars_node.children[i]; + validNodes[i].setPosition(Vec3.ZERO); } } @@ -168,7 +164,7 @@ export class MissEquipComp extends CCComp { /** * 在场上添加一个装备卡: * 1. 在 slots 中查找空闲位。 - * 2. 实例化 equip_box Prefab 并放置在空闲位坐标。 + * 2. 实例化 equip_box Prefab 并挂载到对应 ebar 子节点下。 * 3. 获取或添加 EquipBoxComp 并初始化。 * * @param uuid 装备 UUID @@ -179,6 +175,10 @@ export class MissEquipComp extends CCComp { mLogger.error(this.debugMode, "MissEquipComp", "equip_box prefab not set"); return; } + if (!this.ebars_node || !this.ebars_node.isValid || this.slots.length === 0) { + mLogger.error(this.debugMode, "MissEquipComp", "ebars node not bound"); + return; + } // 查找空闲槽位 const emptyIndex = this.slots.findIndex(slot => !slot.used); @@ -188,10 +188,9 @@ export class MissEquipComp extends CCComp { return; } - // 使用 ECS 实体创建装备节点 + // 使用 ECS 实体创建装备节点,挂载到对应 ebar 子节点下 let ebox = ecs.getEntity(EBox); - let pos = new Vec3(this.slots[emptyIndex].x, this.slots[emptyIndex].y, 0); - let node = ebox.load(uuid, card_lv, pos, this.equip_box); + let node = ebox.load(uuid, card_lv, Vec3.ZERO, this.equip_box, this.ebars_node.children[emptyIndex]); this.slots[emptyIndex].used = true; this.slots[emptyIndex].node = node;