refactor(map): 重构装备卡槽管理与节点挂载逻辑
1. 移除HeroBoxComp中未使用的ebars_node属性
2. 重构EBox.load方法,支持自定义父节点并更新注释
3. 重构MissEquipComp:
- 移除无用的BoxSet导入和硬编码槽位坐标
- 使用ebars_node子节点动态生成槽位
- 修改装备挂载逻辑,将装备挂载到对应ebar子节点而非直接设置位置
- 更新相关注释与日志提示
4. 调整mission.prefab的UI布局参数与绑定节点
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -44,9 +44,7 @@ export class HeroBoxComp extends CCComp {
|
||||
|
||||
// ======================== 编辑器绑定节点 ========================
|
||||
|
||||
/** 装备图标节点 */
|
||||
@property({ type: Node })
|
||||
private ebars_node: Node = null;
|
||||
|
||||
|
||||
/** 英雄图标节点 */
|
||||
@property({ type: Node })
|
||||
|
||||
@@ -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>(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;
|
||||
|
||||
Reference in New Issue
Block a user