From 33d88b2884de410d1c0384adb10637e79d77c5ec Mon Sep 17 00:00:00 2001 From: panw Date: Thu, 19 Mar 2026 09:45:46 +0800 Subject: [PATCH] =?UTF-8?q?fix(skill):=20=E4=BF=AE=E5=A4=8D=E6=8A=80?= =?UTF-8?q?=E8=83=BD=E7=A2=B0=E6=92=9E=E6=A3=80=E6=B5=8B=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E7=A9=BA=E5=AE=9E=E4=BD=93=E5=BC=95=E7=94=A8=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在 SkillView 的 onBeginContact 方法中调整了防御性检查的顺序,确保在访问 targetView.ent 前先验证其存在性,避免潜在的运行时错误。同时将技能 6001 的 EType 从 collision 改为 distanceEnd 以修正其结束判定逻辑。 --- assets/script/game/common/config/SkillSet.ts | 2 +- assets/script/game/skill/SkillView.ts | 15 ++++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/assets/script/game/common/config/SkillSet.ts b/assets/script/game/common/config/SkillSet.ts index 23f839ce..a43fc36a 100644 --- a/assets/script/game/common/config/SkillSet.ts +++ b/assets/script/game/common/config/SkillSet.ts @@ -193,7 +193,7 @@ export const SkillSet: Record = { 6001: { uuid:6001,name:"空挥",sp_name:"atk_s1",icon:"1026",TGroup:TGroup.Enemy,TType:TType.Frontline,readyAnm:"",endAnm:"",act:"atk",DTType:DTType.single, ap:100,hit_count:1,hitcd:0.2,speed:720,with:0, - ready:0,EAnm:0,DAnm:9001,RType:RType.linear,EType:EType.collision, + ready:0,EAnm:0,DAnm:9001,RType:RType.linear,EType:EType.distanceEnd, buffs:[],debuffs:[],info:"对前方目标造成100%攻击的伤害", }, 6002: { diff --git a/assets/script/game/skill/SkillView.ts b/assets/script/game/skill/SkillView.ts index eb02a365..863517b5 100644 --- a/assets/script/game/skill/SkillView.ts +++ b/assets/script/game/skill/SkillView.ts @@ -66,6 +66,13 @@ export class SkillView extends CCComp { if (this.isDisposing) return; if (!this.node || !this.node.activeInHierarchy) return; const targetView = oCol.getComponent(HeroViewComp); + // 不是 HeroViewComp,直接忽略 + if (!targetView) return; + // 🔥 方案A:防御性检查 - 在获取model前强制检查ent是否存在 + if (!targetView.ent) { + mLogger.warn(this.debugMode, 'SkillView', '[SkillView] onBeginContact targetView.ent为空,实体已销毁,忽略此次碰撞'); + return; + } if (this.debugMode) { const casterEid = this.sData.casterEid; const targetName = targetView?.ent?.get(HeroAttrsComp)?.hero_name ?? '非英雄对象'; @@ -83,13 +90,7 @@ export class SkillView extends CCComp { this.handle_collision_limit(); } // 命中次数按碰撞事件统计:不依赖是否最终造成伤害 - // 不是 HeroViewComp,直接忽略 - if (!targetView) return; - // 🔥 方案A:防御性检查 - 在获取model前强制检查ent是否存在 - if (!targetView.ent) { - mLogger.warn(this.debugMode, 'SkillView', '[SkillView] onBeginContact targetView.ent为空,实体已销毁,忽略此次碰撞'); - return; - } + let model = targetView.ent.get(HeroAttrsComp); if (this.debugMode) { mLogger.log(this.debugMode, 'SkillView', `[skillView] 碰撞3`, oCol.group, seCol.group, model);