From 73214dbb1066ab7e0e1bcde2b24bea4d5d7a8b51 Mon Sep 17 00:00:00 2001 From: pan Date: Thu, 4 Jun 2026 10:34:51 +0800 Subject: [PATCH] =?UTF-8?q?feat(skillBox):=20=E6=B7=BB=E5=8A=A0=E6=8A=80?= =?UTF-8?q?=E8=83=BD=E8=B7=A8=E6=B3=A2=E6=AC=A1=E7=BB=B4=E6=8C=81=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 新增keep_waves配置字段控制技能维持波次 2. 重构技能盒组件的波次切换逻辑,支持跨波次持续生效 3. 为默认技能卡添加15波次的维持配置 4. 优化节点销毁的合法性校验逻辑 --- assets/resources/gui/element/MSkillBox.prefab | 43 +----------------- assets/script/game/common/config/CardSet.ts | 17 +++---- assets/script/game/map/SkillBoxComp.ts | 44 ++++++++++++++----- 3 files changed, 45 insertions(+), 59 deletions(-) diff --git a/assets/resources/gui/element/MSkillBox.prefab b/assets/resources/gui/element/MSkillBox.prefab index def1f2b1..a298a1ac 100644 --- a/assets/resources/gui/element/MSkillBox.prefab +++ b/assets/resources/gui/element/MSkillBox.prefab @@ -38,13 +38,10 @@ }, { "__id__": 179 - }, - { - "__id__": 181 } ], "_prefab": { - "__id__": 183 + "__id__": 181 }, "_lpos": { "__type__": "cc.Vec3", @@ -2941,42 +2938,6 @@ "__type__": "cc.CompPrefabInfo", "fileId": "20N3saNnNERbP8SNI6KMUs" }, - { - "__type__": "85b24f6HyJBGrOmgul5dRLh", - "_name": "", - "_objFlags": 0, - "__editorExtras__": {}, - "node": { - "__id__": 1 - }, - "_enabled": true, - "__prefab": { - "__id__": 180 - }, - "card1": { - "__id__": 11 - }, - "card2": { - "__id__": 48 - }, - "card3": { - "__id__": 85 - }, - "refreshBtn": { - "__id__": 132 - }, - "adRefreshBtn": { - "__id__": 153 - }, - "refreshCountLabel": { - "__id__": 142 - }, - "_id": "" - }, - { - "__type__": "cc.CompPrefabInfo", - "fileId": "3eEXZZeMJExoKLpjpFECeL" - }, { "__type__": "cc.BlockInputEvents", "_name": "", @@ -2987,7 +2948,7 @@ }, "_enabled": true, "__prefab": { - "__id__": 182 + "__id__": 180 }, "_id": "" }, diff --git a/assets/script/game/common/config/CardSet.ts b/assets/script/game/common/config/CardSet.ts index 599fbd0f..f29ae385 100644 --- a/assets/script/game/common/config/CardSet.ts +++ b/assets/script/game/common/config/CardSet.ts @@ -61,6 +61,7 @@ export interface CardConfig { is_inst?: boolean // 是否即时起效 t_times?: number // 触发次数 t_inv?: number // 触发间隔(秒) + keep_waves?: number // 维持的波次数(-1表示持续到战斗结束,0或undefined表示仅本波次) } export const CardsUpSet: Record = { 1: 50, @@ -126,14 +127,14 @@ HeroList.forEach(uuid => { // 添加非英雄卡牌 (技能、功能卡) CardPoolList.push( // 技能卡牌 (以增益/辅助为主,因为在备战期没有敌人) - { uuid: 6401, type: CardType.Skill, cost: 0, weight: 20, pool_lv: 1, kind: CKind.Skill, card_lv: 1, name: t("skill_name_6401"), info: t("skill_info_6401"), is_inst: true, t_times: 1, t_inv: 0 }, - { uuid: 6402, type: CardType.Skill, cost: 0, weight: 20, pool_lv: 1, kind: CKind.Skill, card_lv: 1, name: t("skill_name_6402"), info: t("skill_info_6402"), is_inst: true, t_times: 1, t_inv: 0 }, - { uuid: 6403, type: CardType.Skill, cost: 0, weight: 20, pool_lv: 1, kind: CKind.Skill, card_lv: 1, name: t("skill_name_6403"), info: t("skill_info_6403"), is_inst: true, t_times: 1, t_inv: 0 }, - { uuid: 6404, type: CardType.Skill, cost: 0, weight: 20, pool_lv: 1, kind: CKind.Skill, card_lv: 1, name: t("skill_name_6404"), info: t("skill_info_6404"), is_inst: true, t_times: 1, t_inv: 0 }, - { uuid: 6405, type: CardType.Skill, cost: 0, weight: 20, pool_lv: 2, kind: CKind.Skill, card_lv: 1, name: t("skill_name_6405"), info: t("skill_info_6405"), is_inst: true, t_times: 1, t_inv: 0 }, - { uuid: 6406, type: CardType.Skill, cost: 0, weight: 20, pool_lv: 2, kind: CKind.Skill, card_lv: 1, name: t("skill_name_6406"), info: t("skill_info_6406"), is_inst: true, t_times: 1, t_inv: 0 }, - { uuid: 6304, type: CardType.Skill, cost: 0, weight: 20, pool_lv: 3, kind: CKind.Skill, card_lv: 1, name: t("skill_name_6304"), info: t("skill_info_6304"), is_inst: true, t_times: 1, t_inv: 0 }, - { uuid: 6305, type: CardType.Skill, cost: 0, weight: 20, pool_lv: 3, kind: CKind.Skill, card_lv: 1, name: t("skill_name_6305"), info: t("skill_info_6305"), is_inst: true, t_times: 1, t_inv: 0 }, + { uuid: 6401, type: CardType.Skill, cost: 0, weight: 20, pool_lv: 1, kind: CKind.Skill, card_lv: 1, name: t("skill_name_6401"), info: t("skill_info_6401"), is_inst: true, t_times: 1, t_inv: 0, keep_waves:15}, + { uuid: 6402, type: CardType.Skill, cost: 0, weight: 20, pool_lv: 1, kind: CKind.Skill, card_lv: 1, name: t("skill_name_6402"), info: t("skill_info_6402"), is_inst: true, t_times: 1, t_inv: 0, keep_waves:15 }, + { uuid: 6403, type: CardType.Skill, cost: 0, weight: 20, pool_lv: 1, kind: CKind.Skill, card_lv: 1, name: t("skill_name_6403"), info: t("skill_info_6403"), is_inst: true, t_times: 1, t_inv: 0, keep_waves:15 }, + { uuid: 6404, type: CardType.Skill, cost: 0, weight: 20, pool_lv: 1, kind: CKind.Skill, card_lv: 1, name: t("skill_name_6404"), info: t("skill_info_6404"), is_inst: true, t_times: 1, t_inv: 0, keep_waves:15 }, + { uuid: 6405, type: CardType.Skill, cost: 0, weight: 20, pool_lv: 2, kind: CKind.Skill, card_lv: 1, name: t("skill_name_6405"), info: t("skill_info_6405"), is_inst: true, t_times: 1, t_inv: 0, keep_waves:15 }, + { uuid: 6406, type: CardType.Skill, cost: 0, weight: 20, pool_lv: 2, kind: CKind.Skill, card_lv: 1, name: t("skill_name_6406"), info: t("skill_info_6406"), is_inst: true, t_times: 1, t_inv: 0, keep_waves:15 }, + { uuid: 6304, type: CardType.Skill, cost: 0, weight: 20, pool_lv: 3, kind: CKind.Skill, card_lv: 1, name: t("skill_name_6304"), info: t("skill_info_6304"), is_inst: true, t_times: 1, t_inv: 0, keep_waves:15 }, + { uuid: 6305, type: CardType.Skill, cost: 0, weight: 20, pool_lv: 3, kind: CKind.Skill, card_lv: 1, name: t("skill_name_6305"), info: t("skill_info_6305"), is_inst: true, t_times: 1, t_inv: 0, keep_waves:15 }, ); diff --git a/assets/script/game/map/SkillBoxComp.ts b/assets/script/game/map/SkillBoxComp.ts index 12465dd0..b132268a 100644 --- a/assets/script/game/map/SkillBoxComp.ts +++ b/assets/script/game/map/SkillBoxComp.ts @@ -68,6 +68,8 @@ export class SkillBoxComp extends CCComp { private trigger_times: number = 1; /** 触发间隔(秒,仅持续技能有效) */ private trigger_interval: number = 0; + /** 维持的波次数(-1表示直到战斗结束,0表示不跨波次,>0表示维持的具体波次数) */ + private keep_waves: number = 0; // ======================== 运行时状态 ======================== @@ -122,6 +124,7 @@ export class SkillBoxComp extends CCComp { this.is_instant = config.is_inst ?? true; this.trigger_times = config.t_times ?? 1; this.trigger_interval = config.t_inv ?? 0; + this.keep_waves = config.keep_waves ?? 0; } this.current_trigger_times = 0; @@ -134,10 +137,10 @@ export class SkillBoxComp extends CCComp { // 即时技能:立即触发 this.triggerSkill(); this.current_trigger_times++; - if (this.current_trigger_times >= this.trigger_times) { - // 次数已满 → 延迟 1 秒后销毁(保留短暂视觉反馈) + if (this.keep_waves === 0 && this.current_trigger_times >= this.trigger_times) { + // 次数已满且不跨波次维持 → 延迟 1 秒后销毁(保留短暂视觉反馈) this.scheduleOnce(() => { - this.node.destroy(); + if (this.node && this.node.isValid) this.node.destroy(); }, 1.0); } } @@ -196,15 +199,36 @@ export class SkillBoxComp extends CCComp { /** * 新一波:退出战斗状态。 - * 持续技能:若总次数已用完则销毁。 + * 处理维持波次逻辑:递减剩余波次,或者重置触发次数。 */ private handleNewWave() { if (!this.initialized) return; this.in_combat = false; - if (!this.is_instant) { - if (this.current_trigger_times >= this.trigger_times) { - this.node.destroy(); + if (this.keep_waves !== 0) { + if (this.keep_waves > 0) { + this.keep_waves--; + if (this.keep_waves <= 0) { + if (this.node && this.node.isValid) this.node.destroy(); + return; + } + } + // 能够跨波次维持,重置触发次数和计时器,以便新一波继续触发 + this.current_trigger_times = 0; + this.timer = 0; + + // 即时技能在新一波开始时立即触发一次 + if (this.is_instant) { + this.triggerSkill(); + this.current_trigger_times++; + } + this.updateUI(); + } else { + // 默认逻辑:不跨波次维持 + if (!this.is_instant) { + if (this.current_trigger_times >= this.trigger_times) { + if (this.node && this.node.isValid) this.node.destroy(); + } } } } @@ -234,10 +258,10 @@ export class SkillBoxComp extends CCComp { this.current_trigger_times++; this.updateUI(); - // 次数用完 → 延迟销毁 - if (this.current_trigger_times >= this.trigger_times) { + // 次数用完且不跨波次维持 → 延迟销毁 + if (this.keep_waves === 0 && this.current_trigger_times >= this.trigger_times) { this.scheduleOnce(() => { - if (this.node.isValid) this.node.destroy(); + if (this.node && this.node.isValid) this.node.destroy(); }, 0.5); } }