3 Commits

Author SHA1 Message Date
panw
b01a3d2b84 feat(skill): 重做普攻弹道逻辑,优化攻击命中表现
1. 新增atk_ci普攻预制体,替换原有的atk_light预制体配置
2. 调整普攻预制体的位置、缩放属性,更新技能配置的sp名
3. 重构施法目标坐标计算,修正Y轴高度偏移以命中目标中心
4. 优化线性弹道移动逻辑,统一处理弹道延长和旋转计算
5. 更新攻击动画的帧时长和精灵贴图资源
2026-05-18 10:53:21 +08:00
panw
79cf3c1a62 fix: 修正技能飞行轨迹类型与技能描述不一致问题
调整了火球术、风刃、暗影球三个技能的RType从bezier改为linear,同步技能实际轨迹与描述内容,同时清理了胜利UI预制体中的冗余引用配置。
2026-05-18 10:29:35 +08:00
panw
17a8dc0046 feat: 更新普攻技能配置与资源
1.  将普攻技能的射线类型从贝塞尔曲线改为直线
2.  调整所有近战英雄的攻击距离为720
3.  更新普攻预制体的精灵帧、缩放和尺寸参数,添加动画组件
4.  调整普攻动画的采样率和时长
2026-05-18 10:17:27 +08:00
11 changed files with 512 additions and 298 deletions

View File

@@ -7,25 +7,22 @@
"embeddedPlayerGroups": []
},
"_native": "",
"sample": 20,
"sample": 8,
"speed": 1,
"wrapMode": 2,
"enableTrsBlending": false,
"_duration": 0.1,
"_duration": 0.25,
"_hash": 500763545,
"_tracks": [
{
"__id__": 1
},
{
"__id__": 7
}
],
"_exoticAnimation": null,
"_events": [],
"_embeddedPlayers": [],
"_additiveSettings": {
"__id__": 18
"__id__": 7
},
"_auxiliaryCurveEntries": []
},
@@ -70,222 +67,21 @@
},
{
"__type__": "cc.ObjectCurve",
"_times": [],
"_values": []
},
{
"__type__": "cc.animation.VectorTrack",
"_binding": {
"__type__": "cc.animation.TrackBinding",
"path": {
"__id__": 8
},
"proxy": null
},
"_channels": [
{
"__id__": 10
},
{
"__id__": 12
},
{
"__id__": 14
},
{
"__id__": 16
}
"_times": [
0,
0.125
],
"_nComponents": 3
"_values": [
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@39989",
"__expectedType__": "cc.SpriteFrame"
},
{
"__type__": "cc.animation.TrackPath",
"_paths": [
{
"__id__": 9
},
"scale"
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@16ca6",
"__expectedType__": "cc.SpriteFrame"
}
]
},
{
"__type__": "cc.animation.HierarchyPath",
"path": "Node"
},
{
"__type__": "cc.animation.Channel",
"_curve": {
"__id__": 11
}
},
{
"__type__": "cc.RealCurve",
"_times": [
0,
0.05000000074505806,
0.10000000149011612
],
"_values": [
{
"__type__": "cc.RealKeyframeValue",
"interpolationMode": 0,
"tangentWeightMode": 0,
"value": -2.5,
"rightTangent": 0,
"rightTangentWeight": 1,
"leftTangent": 0,
"leftTangentWeight": 1,
"easingMethod": 0,
"__editorExtras__": null
},
{
"__type__": "cc.RealKeyframeValue",
"interpolationMode": 0,
"tangentWeightMode": 0,
"value": -2.5,
"rightTangent": 0,
"rightTangentWeight": 1,
"leftTangent": 0,
"leftTangentWeight": 1,
"easingMethod": 0,
"__editorExtras__": null
},
{
"__type__": "cc.RealKeyframeValue",
"interpolationMode": 0,
"tangentWeightMode": 0,
"value": -2.5,
"rightTangent": 0,
"rightTangentWeight": 1,
"leftTangent": 0,
"leftTangentWeight": 1,
"easingMethod": 0,
"__editorExtras__": null
}
],
"preExtrapolation": 1,
"postExtrapolation": 1
},
{
"__type__": "cc.animation.Channel",
"_curve": {
"__id__": 13
}
},
{
"__type__": "cc.RealCurve",
"_times": [
0,
0.05000000074505806,
0.10000000149011612
],
"_values": [
{
"__type__": "cc.RealKeyframeValue",
"interpolationMode": 0,
"tangentWeightMode": 0,
"value": 2.5,
"rightTangent": 0,
"rightTangentWeight": 1,
"leftTangent": 0,
"leftTangentWeight": 1,
"easingMethod": 0,
"__editorExtras__": null
},
{
"__type__": "cc.RealKeyframeValue",
"interpolationMode": 0,
"tangentWeightMode": 0,
"value": 2.5,
"rightTangent": 0,
"rightTangentWeight": 1,
"leftTangent": 0,
"leftTangentWeight": 1,
"easingMethod": 0,
"__editorExtras__": null
},
{
"__type__": "cc.RealKeyframeValue",
"interpolationMode": 0,
"tangentWeightMode": 0,
"value": 2.5,
"rightTangent": 0,
"rightTangentWeight": 1,
"leftTangent": 0,
"leftTangentWeight": 1,
"easingMethod": 0,
"__editorExtras__": null
}
],
"preExtrapolation": 1,
"postExtrapolation": 1
},
{
"__type__": "cc.animation.Channel",
"_curve": {
"__id__": 15
}
},
{
"__type__": "cc.RealCurve",
"_times": [
0,
0.05000000074505806,
0.10000000149011612
],
"_values": [
{
"__type__": "cc.RealKeyframeValue",
"interpolationMode": 0,
"tangentWeightMode": 0,
"value": 1,
"rightTangent": 0,
"rightTangentWeight": 1,
"leftTangent": 0,
"leftTangentWeight": 1,
"easingMethod": 0,
"__editorExtras__": null
},
{
"__type__": "cc.RealKeyframeValue",
"interpolationMode": 0,
"tangentWeightMode": 0,
"value": 1,
"rightTangent": 0,
"rightTangentWeight": 1,
"leftTangent": 0,
"leftTangentWeight": 1,
"easingMethod": 0,
"__editorExtras__": null
},
{
"__type__": "cc.RealKeyframeValue",
"interpolationMode": 0,
"tangentWeightMode": 0,
"value": 1,
"rightTangent": 0,
"rightTangentWeight": 1,
"leftTangent": 0,
"leftTangentWeight": 1,
"easingMethod": 0,
"__editorExtras__": null
}
],
"preExtrapolation": 1,
"postExtrapolation": 1
},
{
"__type__": "cc.animation.Channel",
"_curve": {
"__id__": 17
}
},
{
"__type__": "cc.RealCurve",
"_times": [],
"_values": [],
"preExtrapolation": 1,
"postExtrapolation": 1
},
{
"__type__": "cc.AnimationClipAdditiveSettings",
"enabled": false,

View File

@@ -11,7 +11,7 @@
"speed": 1,
"wrapMode": 2,
"enableTrsBlending": false,
"_duration": 0.3,
"_duration": 0.13333333333333333,
"_hash": 500763545,
"_tracks": [
{
@@ -71,48 +71,23 @@
0,
0.03333333333333333,
0.06666666666666667,
0.1,
0.13333333333333333,
0.16666666666666666,
0.2,
0.23333333333333334,
0.26666666666666666
0.1
],
"_values": [
{
"__uuid__": "2423272e-e63b-4736-b15b-30b40cf98a23@dce69",
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@c85a2",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "2423272e-e63b-4736-b15b-30b40cf98a23@f3a1e",
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@1526a",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "2423272e-e63b-4736-b15b-30b40cf98a23@d5671",
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@fa8fc",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "2423272e-e63b-4736-b15b-30b40cf98a23@ad18c",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "2423272e-e63b-4736-b15b-30b40cf98a23@7e2c5",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "2423272e-e63b-4736-b15b-30b40cf98a23@dd096",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "2423272e-e63b-4736-b15b-30b40cf98a23@5f8fc",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "2423272e-e63b-4736-b15b-30b40cf98a23@386fd",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "2423272e-e63b-4736-b15b-30b40cf98a23@d4c73",
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@0d06a",
"__expectedType__": "cc.SpriteFrame"
}
]

View File

@@ -35,10 +35,13 @@
},
{
"__id__": 14
},
{
"__id__": 16
}
],
"_prefab": {
"__id__": 16
"__id__": 18
},
"_lpos": {
"__type__": "cc.Vec3",
@@ -92,8 +95,8 @@
},
"_lpos": {
"__type__": "cc.Vec3",
"x": -3.417,
"y": 18.168,
"x": 0,
"y": 0,
"z": 0
},
"_lrot": {
@@ -105,8 +108,8 @@
},
"_lscale": {
"__type__": "cc.Vec3",
"x": -1,
"y": 1.2,
"x": -0.5,
"y": 0.5,
"z": 1
},
"_mobility": 0,
@@ -133,8 +136,8 @@
},
"_contentSize": {
"__type__": "cc.Size",
"width": 60,
"height": 60
"width": 139,
"height": 128
},
"_anchorPoint": {
"__type__": "cc.Vec2",
@@ -169,10 +172,13 @@
"b": 255,
"a": 255
},
"_spriteFrame": null,
"_spriteFrame": {
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@39989",
"__expectedType__": "cc.SpriteFrame"
},
"_type": 0,
"_fillType": 0,
"_sizeMode": 0,
"_sizeMode": 1,
"_fillCenter": {
"__type__": "cc.Vec2",
"x": 0,
@@ -201,6 +207,8 @@
"__id__": 0
},
"fileId": "3arqAMBz1MvoXBzeDaL5M/",
"instance": null,
"targetOverrides": null,
"nestedPrefabInstanceRoots": null
},
{
@@ -218,7 +226,7 @@
"_contentSize": {
"__type__": "cc.Size",
"width": 30,
"height": 100
"height": 50
},
"_anchorPoint": {
"__type__": "cc.Vec2",
@@ -245,7 +253,6 @@
},
"atk_x": 0,
"atk_y": 0,
"debugMode": false,
"_id": ""
},
{
@@ -312,7 +319,7 @@
"_size": {
"__type__": "cc.Size",
"width": 30,
"height": 150
"height": 50
},
"_id": ""
},
@@ -320,6 +327,35 @@
"__type__": "cc.CompPrefabInfo",
"fileId": "ebw5mObxNGGKxnJXDgX5gl"
},
{
"__type__": "cc.Animation",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 17
},
"playOnLoad": false,
"_clips": [
{
"__uuid__": "45017156-064b-43f2-a24e-176b6ce17ad8",
"__expectedType__": "cc.AnimationClip"
}
],
"_defaultClip": {
"__uuid__": "45017156-064b-43f2-a24e-176b6ce17ad8",
"__expectedType__": "cc.AnimationClip"
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "20U0hP/NZErJJXRCEib1lq"
},
{
"__type__": "cc.PrefabInfo",
"root": {

View File

@@ -0,0 +1,371 @@
[
{
"__type__": "cc.Prefab",
"_name": "atk_ci",
"_objFlags": 0,
"__editorExtras__": {},
"_native": "",
"data": {
"__id__": 1
},
"optimizationPolicy": 0,
"persistent": false
},
{
"__type__": "cc.Node",
"_name": "atk_ci",
"_objFlags": 0,
"__editorExtras__": {},
"_parent": null,
"_children": [
{
"__id__": 2
}
],
"_active": true,
"_components": [
{
"__id__": 8
},
{
"__id__": 10
},
{
"__id__": 12
},
{
"__id__": 14
},
{
"__id__": 16
}
],
"_prefab": {
"__id__": 18
},
"_lpos": {
"__type__": "cc.Vec3",
"x": 0,
"y": 0,
"z": 0
},
"_lrot": {
"__type__": "cc.Quat",
"x": 0,
"y": 0,
"z": 0,
"w": 1
},
"_lscale": {
"__type__": "cc.Vec3",
"x": 1,
"y": 1,
"z": 1
},
"_mobility": 0,
"_layer": 1073741824,
"_euler": {
"__type__": "cc.Vec3",
"x": 0,
"y": 0,
"z": 0
},
"_id": ""
},
{
"__type__": "cc.Node",
"_name": "Node",
"_objFlags": 0,
"__editorExtras__": {},
"_parent": {
"__id__": 1
},
"_children": [],
"_active": true,
"_components": [
{
"__id__": 3
},
{
"__id__": 5
}
],
"_prefab": {
"__id__": 7
},
"_lpos": {
"__type__": "cc.Vec3",
"x": 7.98,
"y": 0,
"z": 0
},
"_lrot": {
"__type__": "cc.Quat",
"x": 0,
"y": 0,
"z": 0,
"w": 1
},
"_lscale": {
"__type__": "cc.Vec3",
"x": 1,
"y": 1,
"z": 1
},
"_mobility": 0,
"_layer": 1073741824,
"_euler": {
"__type__": "cc.Vec3",
"x": 0,
"y": 0,
"z": 0
},
"_id": ""
},
{
"__type__": "cc.UITransform",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 2
},
"_enabled": true,
"__prefab": {
"__id__": 4
},
"_contentSize": {
"__type__": "cc.Size",
"width": 64,
"height": 64
},
"_anchorPoint": {
"__type__": "cc.Vec2",
"x": 0.5,
"y": 0.5
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "93pNmvtQlLSqtTgIepyEmA"
},
{
"__type__": "cc.Sprite",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 2
},
"_enabled": true,
"__prefab": {
"__id__": 6
},
"_customMaterial": null,
"_srcBlendFactor": 2,
"_dstBlendFactor": 4,
"_color": {
"__type__": "cc.Color",
"r": 255,
"g": 255,
"b": 255,
"a": 255
},
"_spriteFrame": {
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@c85a2",
"__expectedType__": "cc.SpriteFrame"
},
"_type": 0,
"_fillType": 0,
"_sizeMode": 1,
"_fillCenter": {
"__type__": "cc.Vec2",
"x": 0,
"y": 0
},
"_fillStart": 0,
"_fillRange": 0,
"_isTrimmedMode": true,
"_useGrayscale": false,
"_atlas": {
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6",
"__expectedType__": "cc.SpriteAtlas"
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "12eKc8gltBz50frJCS5+ww"
},
{
"__type__": "cc.PrefabInfo",
"root": {
"__id__": 1
},
"asset": {
"__id__": 0
},
"fileId": "3arqAMBz1MvoXBzeDaL5M/",
"instance": null,
"targetOverrides": null,
"nestedPrefabInstanceRoots": null
},
{
"__type__": "cc.UITransform",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 9
},
"_contentSize": {
"__type__": "cc.Size",
"width": 50,
"height": 50
},
"_anchorPoint": {
"__type__": "cc.Vec2",
"x": 0.5,
"y": 0.5
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "63NP9yq3hEUKD/OZZZ5t7x"
},
{
"__type__": "cc.Animation",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 11
},
"playOnLoad": true,
"_clips": [
{
"__uuid__": "c09c3e6a-dd75-47ec-9db8-cd72c0f9fc59",
"__expectedType__": "cc.AnimationClip"
}
],
"_defaultClip": {
"__uuid__": "c09c3e6a-dd75-47ec-9db8-cd72c0f9fc59",
"__expectedType__": "cc.AnimationClip"
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "c2RDvksalG2acL3tyGCY0t"
},
{
"__type__": "57aabs7TE1J5obTAZczc+64",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 13
},
"atk_x": 10,
"atk_y": 15,
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "60LInmZXxDtKu79AshRG9j"
},
{
"__type__": "cc.RigidBody2D",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 15
},
"enabledContactListener": true,
"bullet": false,
"awakeOnLoad": true,
"_group": 1,
"_type": 1,
"_allowSleep": false,
"_gravityScale": 1,
"_linearDamping": 0,
"_angularDamping": 0,
"_linearVelocity": {
"__type__": "cc.Vec2",
"x": 0,
"y": 0
},
"_angularVelocity": 0,
"_fixedRotation": false,
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "e1yBA625RLwLhzo6bLYW7j"
},
{
"__type__": "cc.BoxCollider2D",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 17
},
"tag": 0,
"_group": 1,
"_density": 1,
"_sensor": true,
"_friction": 0.2,
"_restitution": 0,
"_offset": {
"__type__": "cc.Vec2",
"x": 0,
"y": 0
},
"_size": {
"__type__": "cc.Size",
"width": 50,
"height": 50
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "43ZDJfXX9AX73gyytKQZWm"
},
{
"__type__": "cc.PrefabInfo",
"root": {
"__id__": 1
},
"asset": {
"__id__": 0
},
"fileId": "c46/YsCPVOJYA4mWEpNYRx",
"instance": null,
"targetOverrides": null
}
]

View File

@@ -0,0 +1,13 @@
{
"ver": "1.1.50",
"importer": "prefab",
"imported": true,
"uuid": "6954a335-aa5e-4fb5-b0ad-64af6f0f4da1",
"files": [
".json"
],
"subMetas": {},
"userData": {
"syncNodeName": "atk_ci"
}
}

View File

@@ -95,7 +95,7 @@
},
"_lpos": {
"__type__": "cc.Vec3",
"x": -37.68,
"x": 7.98,
"y": 0,
"z": 0
},
@@ -108,8 +108,8 @@
},
"_lscale": {
"__type__": "cc.Vec3",
"x": 0.8,
"y": 1.8,
"x": 0.5,
"y": 1,
"z": 1
},
"_mobility": 0,
@@ -282,7 +282,6 @@
},
"atk_x": 10,
"atk_y": 15,
"debugMode": true,
"_id": ""
},
{

View File

@@ -6651,6 +6651,8 @@
"__id__": 0
},
"fileId": "28sWVd6AVGOI5O4rPSSn3f",
"instance": null,
"targetOverrides": null,
"nestedPrefabInstanceRoots": null
},
{
@@ -10158,10 +10160,7 @@
"b": 255,
"a": 255
},
"_spriteFrame": {
"__uuid__": "97aa0f88-8138-4b35-94bc-4f691e3f6269@85704",
"__expectedType__": "cc.SpriteFrame"
},
"_spriteFrame": null,
"_type": 0,
"_fillType": 0,
"_sizeMode": 0,
@@ -10174,10 +10173,7 @@
"_fillRange": 0,
"_isTrimmedMode": true,
"_useGrayscale": false,
"_atlas": {
"__uuid__": "97aa0f88-8138-4b35-94bc-4f691e3f6269",
"__expectedType__": "cc.SpriteAtlas"
},
"_atlas": null,
"_id": ""
},
{

View File

@@ -172,24 +172,24 @@ export const SkillUpList = {
export const SkillSet: Record<number, SkillConfig> = {
// ========== 基础技能 ==========
6001: {
uuid:6001,name:"普通攻击",sp_name:"atk",icon:"1026",TGroup:TGroup.Enemy,readyAnm:"",endAnm:"",act:"atk",
uuid:6001,name:"普通攻击",sp_name:"atk_ci",icon:"1026",TGroup:TGroup.Enemy,readyAnm:"",endAnm:"",act:"atk",
DTType:DTType.single,ap:100,hit_count:1,hitcd:0.2,speed:720,with:0,ready:0.2,EAnm:0,DAnm:"",IType:IType.Melee,
RType:RType.bezier,EType:EType.collision,buffs:[],info:"造成攻击力100%的伤害",
RType:RType.linear,EType:EType.collision,buffs:[],info:"造成攻击力100%的伤害",
},
6002: {
uuid:6002,name:"火球术",sp_name:"ball_fire",icon:"1126",TGroup:TGroup.Enemy,readyAnm:"",endAnm:"",act:"atk",
DTType:DTType.single,frz:0,ap:100,hit_count:1,hitcd:0.3,speed:720,with:90,ready:0.2,EAnm:0,DAnm:"",IType:IType.remote,
RType:RType.bezier,EType:EType.collision,buffs:[],info:"发射火球造成攻击力100%的伤害",
RType:RType.linear,EType:EType.collision,buffs:[],info:"发射火球造成攻击力100%的伤害",
},
6003: {
uuid:6003,name:"风刃",sp_name:"ball_winds",icon:"1126",TGroup:TGroup.Enemy,readyAnm:"",endAnm:"",act:"atk",
DTType:DTType.single,ap:100,hit_count:1,hitcd:0.3,speed:720,with:90,ready:0.2,EAnm:0,DAnm:"",IType:IType.remote,
RType:RType.bezier,EType:EType.collision,buffs:[],info:"发射风刃造成攻击力100%的伤害",
RType:RType.linear,EType:EType.collision,buffs:[],info:"发射风刃造成攻击力100%的伤害",
},
6004: {
uuid:6004,name:"暗影球",sp_name:"ball_zi",icon:"1126",TGroup:TGroup.Enemy,readyAnm:"",endAnm:"",act:"atk",
DTType:DTType.single,ap:100,hit_count:1,hitcd:0.3,speed:720,with:90,ready:0.2,EAnm:0,DAnm:"",IType:IType.remote,
RType:RType.bezier,EType:EType.collision,buffs:[],info:"发射暗影球造成攻击力100%的伤害",
RType:RType.linear,EType:EType.collision,buffs:[],info:"发射暗影球造成攻击力100%的伤害",
},
6005: {
uuid:6005,name:"箭矢",sp_name:"arrow",icon:"1135",TGroup:TGroup.Enemy,readyAnm:"",endAnm:"",act:"atk",

View File

@@ -126,15 +126,15 @@ export interface HSkillInfo {
export const HeroInfo: Record<number, heroInfo> = {
// ========== 近战英雄 ==========
5001:{uuid:5001,name:"见习战士",path:"hk2", fac:FacSet.HERO,cards_lv:1,lv:1,type:HType.Melee,dis:120,hp:150,ap:25,speed:800,atking:[{s_uuid:6301,t_num:2}],
5001:{uuid:5001,name:"见习战士",path:"hk2", fac:FacSet.HERO,cards_lv:1,lv:1,type:HType.Melee,dis:720,hp:150,ap:25,speed:800,atking:[{s_uuid:6301,t_num:2}],
skills:{6001:{uuid:6001,lv:1,cd:1.5,ccd:0}},info:"近战,魔法盾 坦克"},
5002:{uuid:5002,name:"盾骑士",path:"hk1", fac:FacSet.HERO,cards_lv:3,lv:1,type:HType.Melee,dis:120,hp:150,ap:75,speed:800,atked:[{s_uuid:6301,t_num:2}],
5002:{uuid:5002,name:"盾骑士",path:"hk1", fac:FacSet.HERO,cards_lv:3,lv:1,type:HType.Melee,dis:720,hp:150,ap:75,speed:800,atked:[{s_uuid:6301,t_num:2}],
skills:{6001:{uuid:6001,lv:1,cd:1.5,ccd:0}},info:"近战,群体护盾 坦克"},
5003:{uuid:5003,name:"战士3",path:"hk3", fac:FacSet.HERO,cards_lv:2,lv:1,type:HType.Melee,dis:120,hp:100,ap:100,speed:800,
5003:{uuid:5003,name:"战士3",path:"hk3", fac:FacSet.HERO,cards_lv:2,lv:1,type:HType.Melee,dis:720,hp:100,ap:100,speed:800,
skills:{6001:{uuid:6001,lv:1,cd:1.5,ccd:0}},info:"近战,闪击 近战dps"},
5004:{uuid:5004,name:"战士4",path:"hk4", fac:FacSet.HERO,cards_lv:4,lv:1,type:HType.Melee,dis:120,hp:100,ap:200,speed:800,
5004:{uuid:5004,name:"战士4",path:"hk4", fac:FacSet.HERO,cards_lv:4,lv:1,type:HType.Melee,dis:720,hp:100,ap:200,speed:800,
skills:{6001:{uuid:6001,lv:1,cd:0.7,ccd:0}},info:"近战,火焰击 近战dps"},
5005:{uuid:5005,name:"战士5",path:"hk5", fac:FacSet.HERO,cards_lv:4,lv:1,type:HType.Melee,dis:120,hp:100,ap:200,speed:800,
5005:{uuid:5005,name:"战士5",path:"hk5", fac:FacSet.HERO,cards_lv:4,lv:1,type:HType.Melee,dis:720,hp:100,ap:200,speed:800,
skills:{6001:{uuid:6001,lv:1,cd:1.5,ccd:0}},info:"治疗近战,火焰击 近战dps"},

View File

@@ -679,9 +679,22 @@ export class SCastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
/** 生成沿目标方向的施法目标坐标 */
private buildEnemyCastTargetPos(caster: HeroViewComp, target: HeroViewComp, castRange: number): Vec3 {
const casterPos = caster.node.position;
const targetPos = target.node.position;
const direction = targetPos.x >= casterPos.x ? 1 : -1;
return new Vec3(casterPos.x + direction * castRange, casterPos.y, casterPos.z);
// 直接返回目标的真实坐标,保留其 Y 轴信息,确保能向目标真实所在位置发射
// 考虑到目前角色的 y 坐标都是脚底(碰撞体底部),为了命中身体中心,给目标 y 加上高度的一半
let halfHeight = 0;
if (target.node) {
const transform = target.node.getComponent('cc.UITransform') as any;
if (transform) {
halfHeight = transform.height / 2;
} else {
halfHeight = 40; // 如果没有 UITransform给一个默认高度偏移
}
}
const pos = target.node.position.clone();
pos.y += halfHeight;
// 至于最终投射物是否要飞出屏幕(例如线性弹道延长至 +-500由 SMoveSystem 统一处理
return pos;
}
}

View File

@@ -64,31 +64,46 @@ export class SMoveSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
switch(moveComp.runType) {
case RType.linear:
// linear类型根据atk_x和atk_y调整位置
// linear类型根据atk_x和atk_y调整起始位置
const adjustedStartPos = v3(
moveComp.startPos.x + moveComp.atk_x,
moveComp.startPos.x + moveComp.atk_x * moveComp.scale,
moveComp.startPos.y + moveComp.atk_y,
moveComp.startPos.z
);
const adjustedTargetPos = v3(
moveComp.targetPos.x + moveComp.atk_x,
moveComp.targetPos.y + moveComp.atk_y,
const originTargetPos = v3(
moveComp.targetPos.x,
moveComp.targetPos.y,
moveComp.targetPos.z
);
// 如果开启水平移动开关强制目标Y等于起点Y
if (moveComp.isHorizontal) {
adjustedTargetPos.y = adjustedStartPos.y;
const direction = new Vec3();
Vec3.subtract(direction, originTargetPos, adjustedStartPos);
// 延长终止点统一消亡点的x坐标为 +-500
const targetX = moveComp.scale > 0 ? 500 : -500;
let targetY = originTargetPos.y;
if (Math.abs(direction.x) > 0.01) {
const slope = direction.y / direction.x;
targetY = adjustedStartPos.y + slope * (targetX - adjustedStartPos.x);
}
const adjustedTargetPos = v3(
targetX,
targetY,
originTargetPos.z
);
moveComp.startPos.set(adjustedStartPos);
moveComp.targetPos.set(adjustedTargetPos);
node.setPosition(adjustedStartPos);
// 设置旋转角度
const direction = new Vec3();
Vec3.subtract(direction, moveComp.targetPos, moveComp.startPos);
if (direction.length() > 0.01) {
const angle = Math.atan2(direction.y, direction.x) * (180 / Math.PI);
const dirForAngle = new Vec3();
Vec3.subtract(dirForAngle, adjustedTargetPos, adjustedStartPos);
if (dirForAngle.length() > 0.01) {
const angle = Math.atan2(dirForAngle.y, dirForAngle.x) * (180 / Math.PI);
node.angle = angle;
}
break;