fix: 修复技能碰撞检测和英雄prefab配置问题

修复技能碰撞检测逻辑,确保正确应用伤害并过滤同组碰撞
调整多个英雄prefab的_enabled状态和碰撞组配置
优化技能视图的日志输出和伤害应用逻辑
移除不必要的prefab组件和调试日志
This commit is contained in:
2025-11-01 23:10:38 +08:00
parent 2e1c6c3aa1
commit 1091b0399e
19 changed files with 40 additions and 164 deletions

View File

@@ -991,7 +991,7 @@
"node": { "node": {
"__id__": 1 "__id__": 1
}, },
"_enabled": true, "_enabled": false,
"__prefab": { "__prefab": {
"__id__": 62 "__id__": 62
}, },

View File

@@ -991,7 +991,7 @@
"node": { "node": {
"__id__": 1 "__id__": 1
}, },
"_enabled": true, "_enabled": false,
"__prefab": { "__prefab": {
"__id__": 62 "__id__": 62
}, },

View File

@@ -991,7 +991,7 @@
"node": { "node": {
"__id__": 1 "__id__": 1
}, },
"_enabled": true, "_enabled": false,
"__prefab": { "__prefab": {
"__id__": 62 "__id__": 62
}, },

View File

@@ -991,7 +991,7 @@
"node": { "node": {
"__id__": 1 "__id__": 1
}, },
"_enabled": true, "_enabled": false,
"__prefab": { "__prefab": {
"__id__": 62 "__id__": 62
}, },

View File

@@ -991,7 +991,7 @@
"node": { "node": {
"__id__": 1 "__id__": 1
}, },
"_enabled": true, "_enabled": false,
"__prefab": { "__prefab": {
"__id__": 62 "__id__": 62
}, },

View File

@@ -991,7 +991,7 @@
"node": { "node": {
"__id__": 1 "__id__": 1
}, },
"_enabled": true, "_enabled": false,
"__prefab": { "__prefab": {
"__id__": 62 "__id__": 62
}, },

View File

@@ -991,7 +991,7 @@
"node": { "node": {
"__id__": 1 "__id__": 1
}, },
"_enabled": true, "_enabled": false,
"__prefab": { "__prefab": {
"__id__": 62 "__id__": 62
}, },

View File

@@ -961,7 +961,7 @@
"enabledContactListener": true, "enabledContactListener": true,
"bullet": false, "bullet": false,
"awakeOnLoad": true, "awakeOnLoad": true,
"_group": 4, "_group": 2,
"_type": 1, "_type": 1,
"_allowSleep": false, "_allowSleep": false,
"_gravityScale": 1, "_gravityScale": 1,
@@ -988,7 +988,7 @@
"node": { "node": {
"__id__": 1 "__id__": 1
}, },
"_enabled": true, "_enabled": false,
"__prefab": { "__prefab": {
"__id__": 62 "__id__": 62
}, },

View File

@@ -964,7 +964,7 @@
"enabledContactListener": true, "enabledContactListener": true,
"bullet": false, "bullet": false,
"awakeOnLoad": true, "awakeOnLoad": true,
"_group": 4, "_group": 2,
"_type": 1, "_type": 1,
"_allowSleep": false, "_allowSleep": false,
"_gravityScale": 1, "_gravityScale": 1,
@@ -991,7 +991,7 @@
"node": { "node": {
"__id__": 1 "__id__": 1
}, },
"_enabled": true, "_enabled": false,
"__prefab": { "__prefab": {
"__id__": 62 "__id__": 62
}, },

View File

@@ -964,7 +964,7 @@
"enabledContactListener": true, "enabledContactListener": true,
"bullet": false, "bullet": false,
"awakeOnLoad": true, "awakeOnLoad": true,
"_group": 4, "_group": 2,
"_type": 1, "_type": 1,
"_allowSleep": false, "_allowSleep": false,
"_gravityScale": 1, "_gravityScale": 1,
@@ -991,7 +991,7 @@
"node": { "node": {
"__id__": 1 "__id__": 1
}, },
"_enabled": true, "_enabled": false,
"__prefab": { "__prefab": {
"__id__": 62 "__id__": 62
}, },

View File

@@ -964,7 +964,7 @@
"enabledContactListener": true, "enabledContactListener": true,
"bullet": false, "bullet": false,
"awakeOnLoad": true, "awakeOnLoad": true,
"_group": 4, "_group": 2,
"_type": 1, "_type": 1,
"_allowSleep": false, "_allowSleep": false,
"_gravityScale": 1, "_gravityScale": 1,
@@ -991,7 +991,7 @@
"node": { "node": {
"__id__": 1 "__id__": 1
}, },
"_enabled": true, "_enabled": false,
"__prefab": { "__prefab": {
"__id__": 62 "__id__": 62
}, },

View File

@@ -32,13 +32,10 @@
}, },
{ {
"__id__": 16 "__id__": 16
},
{
"__id__": 18
} }
], ],
"_prefab": { "_prefab": {
"__id__": 20 "__id__": 18
}, },
"_lpos": { "_lpos": {
"__type__": "cc.Vec3", "__type__": "cc.Vec3",
@@ -353,48 +350,12 @@
}, },
"atk_x": 0, "atk_x": 0,
"atk_y": 0, "atk_y": 0,
"runType": 2,
"endType": 0,
"_id": "" "_id": ""
}, },
{ {
"__type__": "cc.CompPrefabInfo", "__type__": "cc.CompPrefabInfo",
"fileId": "35nW0iQNBH2bqkWAr3MVkQ" "fileId": "35nW0iQNBH2bqkWAr3MVkQ"
}, },
{
"__type__": "f680dkagx9PmbfqtF463/Ua",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 19
},
"speed": 600,
"controlPointSide": 1,
"controlPointOffset": 0.5,
"controlPointRandomness": 0.3,
"autoRotate": false,
"showTrajectory": false,
"trajectoryColor": {
"__type__": "cc.Color",
"r": 0,
"g": 255,
"b": 0,
"a": 255
},
"trajectoryWidth": 3,
"easing": "linear",
"rotationSmoothness": 0.6,
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "defJ3noEdMUapDOKtsHbd+"
},
{ {
"__type__": "cc.PrefabInfo", "__type__": "cc.PrefabInfo",
"root": { "root": {

View File

@@ -32,13 +32,10 @@
}, },
{ {
"__id__": 16 "__id__": 16
},
{
"__id__": 18
} }
], ],
"_prefab": { "_prefab": {
"__id__": 20 "__id__": 18
}, },
"_lpos": { "_lpos": {
"__type__": "cc.Vec3", "__type__": "cc.Vec3",
@@ -353,48 +350,12 @@
}, },
"atk_x": 0, "atk_x": 0,
"atk_y": 0, "atk_y": 0,
"runType": 2,
"endType": 0,
"_id": "" "_id": ""
}, },
{ {
"__type__": "cc.CompPrefabInfo", "__type__": "cc.CompPrefabInfo",
"fileId": "60LInmZXxDtKu79AshRG9j" "fileId": "60LInmZXxDtKu79AshRG9j"
}, },
{
"__type__": "f680dkagx9PmbfqtF463/Ua",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 19
},
"speed": 600,
"controlPointSide": 1,
"controlPointOffset": 0.5,
"controlPointRandomness": 0.3,
"autoRotate": false,
"showTrajectory": false,
"trajectoryColor": {
"__type__": "cc.Color",
"r": 0,
"g": 255,
"b": 0,
"a": 255
},
"trajectoryWidth": 3,
"easing": "linear",
"rotationSmoothness": 0.6,
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "65YLwe9t9EXo5kI3HQEGhs"
},
{ {
"__type__": "cc.PrefabInfo", "__type__": "cc.PrefabInfo",
"root": { "root": {

View File

@@ -276,8 +276,6 @@
}, },
"atk_x": 0, "atk_x": 0,
"atk_y": 0, "atk_y": 0,
"runType": 2,
"endType": 0,
"_id": "" "_id": ""
}, },
{ {
@@ -330,12 +328,12 @@
"__prefab": { "__prefab": {
"__id__": 17 "__id__": 17
}, },
"enabledContactListener": false, "enabledContactListener": true,
"bullet": false, "bullet": false,
"awakeOnLoad": true, "awakeOnLoad": true,
"_group": 1, "_group": 1,
"_type": 2, "_type": 1,
"_allowSleep": true, "_allowSleep": false,
"_gravityScale": 1, "_gravityScale": 1,
"_linearDamping": 0, "_linearDamping": 0,
"_angularDamping": 0, "_angularDamping": 0,
@@ -367,7 +365,7 @@
"tag": 0, "tag": 0,
"_group": 1, "_group": 1,
"_density": 1, "_density": 1,
"_sensor": false, "_sensor": true,
"_friction": 0.2, "_friction": 0.2,
"_restitution": 0, "_restitution": 0,
"_offset": { "_offset": {

View File

@@ -38,13 +38,10 @@
}, },
{ {
"__id__": 16 "__id__": 16
},
{
"__id__": 18
} }
], ],
"_prefab": { "_prefab": {
"__id__": 20 "__id__": 18
}, },
"_lpos": { "_lpos": {
"__type__": "cc.Vec3", "__type__": "cc.Vec3",
@@ -292,7 +289,7 @@
"fileId": "60LInmZXxDtKu79AshRG9j" "fileId": "60LInmZXxDtKu79AshRG9j"
}, },
{ {
"__type__": "f680dkagx9PmbfqtF463/Ua", "__type__": "cc.RigidBody2D",
"_name": "", "_name": "",
"_objFlags": 0, "_objFlags": 0,
"__editorExtras__": {}, "__editorExtras__": {},
@@ -303,46 +300,12 @@
"__prefab": { "__prefab": {
"__id__": 15 "__id__": 15
}, },
"speed": 600, "enabledContactListener": true,
"controlPointSide": 1,
"controlPointOffset": 0.5,
"controlPointRandomness": 0.3,
"autoRotate": false,
"showTrajectory": false,
"trajectoryColor": {
"__type__": "cc.Color",
"r": 0,
"g": 255,
"b": 0,
"a": 255
},
"trajectoryWidth": 3,
"easing": "linear",
"rotationSmoothness": 0.6,
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "65YLwe9t9EXo5kI3HQEGhs"
},
{
"__type__": "cc.RigidBody2D",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 17
},
"enabledContactListener": false,
"bullet": false, "bullet": false,
"awakeOnLoad": true, "awakeOnLoad": true,
"_group": 1, "_group": 1,
"_type": 2, "_type": 1,
"_allowSleep": true, "_allowSleep": false,
"_gravityScale": 1, "_gravityScale": 1,
"_linearDamping": 0, "_linearDamping": 0,
"_angularDamping": 0, "_angularDamping": 0,
@@ -369,12 +332,12 @@
}, },
"_enabled": true, "_enabled": true,
"__prefab": { "__prefab": {
"__id__": 19 "__id__": 17
}, },
"tag": 0, "tag": 0,
"_group": 1, "_group": 1,
"_density": 1, "_density": 1,
"_sensor": false, "_sensor": true,
"_friction": 0.2, "_friction": 0.2,
"_restitution": 0, "_restitution": 0,
"_offset": { "_offset": {

View File

@@ -51,7 +51,7 @@ export class HeroViewComp extends CCComp {
const collider = this.node.getComponent(BoxCollider2D); const collider = this.node.getComponent(BoxCollider2D);
this.scheduleOnce(()=>{ this.scheduleOnce(()=>{
if (collider) collider.enabled = true; // 先禁 if (collider) collider.enabled = true; // 先禁
},1) },0.1)
// let anm = this.node.getChildByName("anm") // let anm = this.node.getChildByName("anm")
// anm.setScale(anm.scale.x*0.8,anm.scale.y*0.8); // anm.setScale(anm.scale.x*0.8,anm.scale.y*0.8);
} }

View File

@@ -37,7 +37,6 @@ export class Monster extends ecs.Entity {
/** 加载角色 */ /** 加载角色 */
load(pos: Vec3 = Vec3.ZERO,scale:number = 1,uuid:number=1001,lv:number=1,monType:MonType=MonType.NORMAL, buffs: BuffConf[] = [],is_call=false) { load(pos: Vec3 = Vec3.ZERO,scale:number = 1,uuid:number=1001,lv:number=1,monType:MonType=MonType.NORMAL, buffs: BuffConf[] = [],is_call=false) {
scale=-1 scale=-1
let box_group=BoxSet.MONSTER
var scene = smc.map.MapView.scene; var scene = smc.map.MapView.scene;
var path = "game/heros/"+HeroInfo[uuid].path; var path = "game/heros/"+HeroInfo[uuid].path;
var prefab: Prefab = oops.res.get(path, Prefab)!; var prefab: Prefab = oops.res.get(path, Prefab)!;
@@ -55,7 +54,7 @@ export class Monster extends ecs.Entity {
let hero = HeroInfo[uuid]; // 共用英雄数据 let hero = HeroInfo[uuid]; // 共用英雄数据
// 设置 View 层属性(表现相关) // 设置 View 层属性(表现相关)
view.scale = scale; view.scale = scale;
view.box_group = box_group; view.box_group = BoxSet.MONSTER;
// 设置 Model 层属性(数据相关) // 设置 Model 层属性(数据相关)
model.hero_uuid = uuid; model.hero_uuid = uuid;

View File

@@ -166,6 +166,8 @@ export class SACastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdat
// 这里可以调用 SkillConComp 的目标选择逻辑 // 这里可以调用 SkillConComp 的目标选择逻辑
// 暂时返回默认位置 // 暂时返回默认位置
if (caster==null ) return
if(caster.ent == null) return
const heroAttrs = caster.ent.get(HeroAttrsComp); const heroAttrs = caster.ent.get(HeroAttrsComp);
const fac = heroAttrs?.fac ?? 0; const fac = heroAttrs?.fac ?? 0;
const defaultX = fac === 0 ? 400 : -400; const defaultX = fac === 0 ? 400 : -400;

View File

@@ -38,7 +38,6 @@ export class SkillView extends CCComp {
if(collider) { if(collider) {
collider.group = this.group; collider.group = this.group;
collider.on(Contact2DType.BEGIN_CONTACT, this.onBeginContact, this); collider.on(Contact2DType.BEGIN_CONTACT, this.onBeginContact, this);
console.log(`[skillView] ${this.sData.caster.ent.get(HeroAttrsComp).hero_name}${this.SConf.name} 碰撞组 ${this.group}`)
} }
if(this.node.getComponent(Animation)){ if(this.node.getComponent(Animation)){
let anim = this.node.getComponent(Animation); let anim = this.node.getComponent(Animation);
@@ -48,18 +47,16 @@ export class SkillView extends CCComp {
} }
onBeginContact (seCol: Collider2D, oCol: Collider2D) { onBeginContact (seCol: Collider2D, oCol: Collider2D) {
console.log(`[skillView] ${this.sData.caster.ent.get(HeroAttrsComp).hero_name}${this.SConf.name} 碰撞了 ${oCol.getComponent(HeroViewComp).ent.get(HeroAttrsComp).hero_name}`); if(oCol.group==this.group) return
if (!this.SConf) return;
if(this.SConf.EType!=EType.collision) return if(this.SConf.EType!=EType.collision) return
let target = oCol.getComponent(HeroViewComp) let target = oCol.getComponent(HeroViewComp)
if(target == null) return;
let model=target.ent.get(HeroAttrsComp) let model=target.ent.get(HeroAttrsComp)
if(!model) return
if(model.is_dead) return if(model.is_dead) return
if(oCol.group!=this.group){ // console.log(`[skillView] 碰撞5[${this.sData.caster.box_group}][${this.sData.caster.ent.get(HeroAttrsComp).hero_name}][${this.sData.caster.ent.eid}]的[${this.group}] [${this.SConf.name}]碰撞了 [${oCol.group}][ ${oCol.getComponent(HeroViewComp).ent.get(HeroAttrsComp).hero_name}][${oCol.getComponent(HeroViewComp).ent.eid}]`);
if(target == null) return; this.apply_damage(target)
if (!this.SConf) return;
if(this.SConf.EType==EType.collision){
this.apply_damage(target)
}
}
} }
onAnimationFinished(){ onAnimationFinished(){
@@ -98,11 +95,9 @@ export class SkillView extends CCComp {
const distanceB = Math.abs(this.node.position.x - b.node.position.x); const distanceB = Math.abs(this.node.position.x - b.node.position.x);
return distanceA - distanceB; return distanceA - distanceB;
}); });
// 限制目标数量 // 限制目标数量
const maxTargets = Math.min(hitNum, IRTargets.length); const maxTargets = Math.min(hitNum, IRTargets.length);
const sTargets = IRTargets.slice(0, maxTargets); const sTargets = IRTargets.slice(0, maxTargets);
sTargets.forEach(target => { sTargets.forEach(target => {
this.apply_damage(target, false); this.apply_damage(target, false);
}); });
@@ -120,7 +115,8 @@ export class SkillView extends CCComp {
apply_damage(target:HeroViewComp,is_range:boolean=false){ apply_damage(target:HeroViewComp,is_range:boolean=false){
if(target == null) return; if(target == null) return;
if (!this.SConf) return; if (!this.SConf) return;
console.log(`[skillView] 伤害 [${this.group}][${this.sData.caster.ent.get(HeroAttrsComp).hero_name}][${this.sData.caster.ent.eid}]的 [${this.SConf.name}]对 [${target.box_group}][ ${target.ent.get(HeroAttrsComp).hero_name}][${target.ent.eid}]`);
// if(this.sData.hit_count > this.SConf.hit_num) return 不能超出 最大伤害数量
// 使用伤害队列系统处理伤害 // 使用伤害队列系统处理伤害
DamageQueueHelper.addDamageToEntity( DamageQueueHelper.addDamageToEntity(
target.ent, target.ent,
@@ -128,12 +124,8 @@ export class SkillView extends CCComp {
this.sData.caster, this.sData.caster,
this.sData.s_uuid this.sData.s_uuid
); );
// console.log(`[SkillCom]: ${this.sData.caster.ent.get(HeroAttrsComp).hero_name}[${this.sData.caster.ent.get(HeroAttrsComp).fac}:${ this.sData.fac}:${target.ent.get(HeroAttrsComp).fac}] 对 ${target.ent.get(HeroAttrsComp).hero_name} 释放技能 ${this.SConf.name}`)
// 更新技能命中次数 // 更新技能命中次数
this.sData.hit_count++ this.sData.hit_count++
// 检查技能是否应该销毁 // 检查技能是否应该销毁
if( this.sData.hit_count>=(this.SConf.hit+ this.sData.Attrs[Attrs.PUNCTURE])&&(this.SConf.DTType!=DTType.range)&&(this.SConf.EType!=EType.animationEnd)&&(this.SConf.EType!=EType.timeEnd)) this.ent.destroy// 技能命中次数 if( this.sData.hit_count>=(this.SConf.hit+ this.sData.Attrs[Attrs.PUNCTURE])&&(this.SConf.DTType!=DTType.range)&&(this.SConf.EType!=EType.animationEnd)&&(this.SConf.EType!=EType.timeEnd)) this.ent.destroy// 技能命中次数
} }