```
feat(EliteSoldier): 精锐士兵重构为刺客定位技能体系 - 完全重写EliteSoldierSkill.cs,将职业定位从大剑狂战改为刺客 - 实现1级【裂空突袭】:飞天斩击敌方后排,造成200%物理暴击伤害 - 添加3级【弱点锁定】:伤害提升至250%,暴击率+25%,落地移速+35% - 添加6级【影袭破防】:目标眩晕1.2秒且物理易伤35% - 添加10级【死斗连环】:击杀后连斩最多3次,无缝腾空攻击下一个后排 - 优化动画系统:飞跃期间关闭root motion和nav mesh agent避免位移冲突 - 更新动画控制器override controller的clip引用 - 在预制体中添加isStunImmune字段用于10级霸体效果 - 更新游戏说明文档中的技能描述和开发日志 ```
This commit is contained in:
1 parent
ec35c6c154
commit
a9869b7419
18 files changed
+25041
-51
No files matched your search
@@ -23,5 +23,5 @@ AnimatorOverrideController:
|
||||
type: 3}
|
||||
- m_OriginalClip: {fileID: -203655887218126122, guid: b82d15855591849bd80b62238bcd4ed3,
|
||||
type: 3}
|
||||
m_OverrideClip: {fileID: -203655887218126122, guid: aedcf7ed294f23b489dc19f0da73d5a9,
|
||||
m_OverrideClip: {fileID: -203655887218126122, guid: 1f1437cb5f60a45b5add7f1802c087f7,
|
||||
type: 3}
|
||||
Binary file not shown.
@@ -0,0 +1,553 @@
|
||||
fileFormatVersion: 2
|
||||
guid: DiwesSmqACkiDRejsP9nLG2dc5Cn6YD5estBLnNj+81Sb+ZwfqJ8+vQ=
|
||||
ModelImporter:
|
||||
serializedVersion: 22361
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
materials:
|
||||
materialImportMode: 2
|
||||
materialName: 0
|
||||
materialSearch: 1
|
||||
materialLocation: 1
|
||||
animations:
|
||||
legacyGenerateAnimations: 4
|
||||
bakeSimulation: 0
|
||||
resampleCurves: 1
|
||||
optimizeGameObjects: 0
|
||||
removeConstantScaleCurves: 0
|
||||
motionNodeName:
|
||||
rigImportErrors:
|
||||
rigImportWarnings:
|
||||
animationImportErrors:
|
||||
animationImportWarnings:
|
||||
animationRetargetingWarnings:
|
||||
animationDoRetargetingWarnings: 0
|
||||
importAnimatedCustomProperties: 0
|
||||
importConstraints: 0
|
||||
animationCompression: 3
|
||||
aCLCompressionLevel: 3
|
||||
aCLCurvePrecision: 0.01
|
||||
aCLFastSampleMode: 1
|
||||
animationRotationError: 0.5
|
||||
animationPositionError: 0.5
|
||||
animationScaleError: 0.5
|
||||
animationWrapMode: 0
|
||||
extraExposedTransformPaths: []
|
||||
extraUserProperties: []
|
||||
clipAnimations:
|
||||
- serializedVersion: 18
|
||||
name: "\u8DC3\u8D77\u5288\u780D"
|
||||
takeName: mixamo.com
|
||||
internalID: -203655887218126122
|
||||
firstFrame: 0
|
||||
lastFrame: 62
|
||||
wrapMode: 0
|
||||
orientationOffsetY: 0
|
||||
level: 0
|
||||
cycleOffset: 0
|
||||
loop: 0
|
||||
hasAdditiveReferencePose: 0
|
||||
lockToRoot: 0
|
||||
loopTime: 0
|
||||
loopBlend: 0
|
||||
loopBlendOrientation: 0
|
||||
loopBlendPositionY: 0
|
||||
loopBlendPositionXZ: 0
|
||||
keepOriginalOrientation: 0
|
||||
keepOriginalPositionY: 1
|
||||
keepOriginalPositionXZ: 0
|
||||
heightFromFeet: 0
|
||||
mirror: 0
|
||||
bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000
|
||||
curves: []
|
||||
events:
|
||||
- time: 0.5276343
|
||||
functionName: OnSkillHit1
|
||||
data:
|
||||
objectReferenceParameter: {instanceID: 0}
|
||||
floatParameter: 0
|
||||
intParameter: 0
|
||||
messageOptions: 0
|
||||
intervals: []
|
||||
transformMask: []
|
||||
maskType: 3
|
||||
maskSource: {instanceID: 0}
|
||||
additiveReferencePoseFrame: 0
|
||||
additiveType: 0
|
||||
basePoseType: 0
|
||||
additiveSelectedAnimation: {instanceID: 0}
|
||||
additiveSelectedAnimationFrameIndex: 0
|
||||
isReadable: 0
|
||||
tuanjieGIEnable: 0
|
||||
tuanjieGIGenSDFFactor: 1
|
||||
tuanjieGIGenSDFBias: 0.25
|
||||
tuanjieGIDoubleSidedMode: 0
|
||||
tuanjieGIGenFacetNums: 12
|
||||
meshes:
|
||||
lODScreenPercentages: []
|
||||
globalScale: 1
|
||||
meshCompression: 0
|
||||
totalVerticesCount: 0
|
||||
totalTrianglesCount: 0
|
||||
addColliders: 0
|
||||
useSRGBMaterialColor: 1
|
||||
sortHierarchyByName: 1
|
||||
importPhysicalCameras: 1
|
||||
importVisibility: 1
|
||||
importBlendShapes: 1
|
||||
importCameras: 1
|
||||
importLights: 1
|
||||
nodeNameCollisionStrategy: 1
|
||||
fileIdsGeneration: 2
|
||||
swapUVChannels: 0
|
||||
generateSecondaryUV: 0
|
||||
useFileUnits: 1
|
||||
keepQuads: 0
|
||||
weldVertices: 1
|
||||
bakeAxisConversion: 0
|
||||
preserveHierarchy: 0
|
||||
skinWeightsMode: 0
|
||||
maxBonesPerVertex: 4
|
||||
minBoneWeight: 0.001
|
||||
optimizeBones: 1
|
||||
meshOptimizationFlags: -1
|
||||
indexFormat: 0
|
||||
secondaryUVAngleDistortion: 8
|
||||
secondaryUVAreaDistortion: 15.000001
|
||||
secondaryUVHardAngle: 88
|
||||
secondaryUVMarginMethod: 1
|
||||
secondaryUVMinLightmapResolution: 40
|
||||
secondaryUVMinObjectScale: 1
|
||||
secondaryUVPackMargin: 4
|
||||
useFileScale: 1
|
||||
strictVertexDataChecks: 0
|
||||
virtualGeometry:
|
||||
virtualGeometry: 0
|
||||
useTransparent: 0
|
||||
setVGForeachMesh: 0
|
||||
isFirstUse: 1
|
||||
virtualGeometrySettings:
|
||||
generateGeometryBuffer: 0
|
||||
surfaceCompensation: 0
|
||||
allMeshUse: 1
|
||||
ignoreSimpleMesh: 0
|
||||
transformScaleState: 0
|
||||
isPossibleOverflow: 0
|
||||
hasBoneData: 0
|
||||
isBoneCountOverflow: 0
|
||||
virtualGeometryPlatformSettings:
|
||||
- serializedVersion: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
buildTarget: DefaultVirtualGeometryPlatform
|
||||
positionPrecision: -2147483648
|
||||
normalPrecision: -2147483648
|
||||
tangentPrecision: -2147483648
|
||||
boneWeightPrecision: -2147483648
|
||||
detailedTriangleCount: 0
|
||||
detailedVertexCount: 0
|
||||
rootPageSize: 0
|
||||
streamablePageSize: 0
|
||||
reserveTrianglePercent: 100
|
||||
reserveDetailLevel: 0
|
||||
- serializedVersion: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
buildTarget: Standalone
|
||||
positionPrecision: -2147483648
|
||||
normalPrecision: -2147483648
|
||||
tangentPrecision: -2147483648
|
||||
boneWeightPrecision: -2147483648
|
||||
detailedTriangleCount: 0
|
||||
detailedVertexCount: 0
|
||||
rootPageSize: 0
|
||||
streamablePageSize: 0
|
||||
reserveTrianglePercent: 100
|
||||
reserveDetailLevel: 0
|
||||
- serializedVersion: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
buildTarget: iPhone
|
||||
positionPrecision: -2147483648
|
||||
normalPrecision: -2147483648
|
||||
tangentPrecision: -2147483648
|
||||
boneWeightPrecision: -2147483648
|
||||
detailedTriangleCount: 0
|
||||
detailedVertexCount: 0
|
||||
rootPageSize: 0
|
||||
streamablePageSize: 0
|
||||
reserveTrianglePercent: 100
|
||||
reserveDetailLevel: 0
|
||||
- serializedVersion: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
buildTarget: Android
|
||||
positionPrecision: -2147483648
|
||||
normalPrecision: -2147483648
|
||||
tangentPrecision: -2147483648
|
||||
boneWeightPrecision: -2147483648
|
||||
detailedTriangleCount: 0
|
||||
detailedVertexCount: 0
|
||||
rootPageSize: 0
|
||||
streamablePageSize: 0
|
||||
reserveTrianglePercent: 100
|
||||
reserveDetailLevel: 0
|
||||
selectedVGMeshes: []
|
||||
supportVGMeshes: []
|
||||
tangentSpace:
|
||||
normalSmoothAngle: 60
|
||||
normalImportMode: 0
|
||||
tangentImportMode: 3
|
||||
normalCalculationMode: 4
|
||||
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
|
||||
blendShapeNormalImportMode: 1
|
||||
normalSmoothingSource: 0
|
||||
referencedClips: []
|
||||
importAnimation: 1
|
||||
overrideDefaultPose: 0
|
||||
humanDescription:
|
||||
serializedVersion: 3
|
||||
human:
|
||||
- boneName: mixamorig:Hips
|
||||
humanName: Hips
|
||||
limit:
|
||||
min: {x: 0, y: 0, z: 0}
|
||||
max: {x: 0, y: 0, z: 0}
|
||||
value: {x: 0, y: 0, z: 0}
|
||||
length: 0
|
||||
modified: 0
|
||||
- boneName: mixamorig:LeftUpLeg
|
||||
humanName: LeftUpperLeg
|
||||
limit:
|
||||
min: {x: 0, y: 0, z: 0}
|
||||
max: {x: 0, y: 0, z: 0}
|
||||
value: {x: 0, y: 0, z: 0}
|
||||
length: 0
|
||||
modified: 0
|
||||
- boneName: mixamorig:RightUpLeg
|
||||
humanName: RightUpperLeg
|
||||
limit:
|
||||
min: {x: 0, y: 0, z: 0}
|
||||
max: {x: 0, y: 0, z: 0}
|
||||
value: {x: 0, y: 0, z: 0}
|
||||
length: 0
|
||||
modified: 0
|
||||
- boneName: mixamorig:LeftLeg
|
||||
humanName: LeftLowerLeg
|
||||
limit:
|
||||
min: {x: 0, y: 0, z: 0}
|
||||
max: {x: 0, y: 0, z: 0}
|
||||
value: {x: 0, y: 0, z: 0}
|
||||
length: 0
|
||||
modified: 0
|
||||
- boneName: mixamorig:RightLeg
|
||||
humanName: RightLowerLeg
|
||||
limit:
|
||||
min: {x: 0, y: 0, z: 0}
|
||||
max: {x: 0, y: 0, z: 0}
|
||||
value: {x: 0, y: 0, z: 0}
|
||||
length: 0
|
||||
modified: 0
|
||||
- boneName: mixamorig:LeftFoot
|
||||
humanName: LeftFoot
|
||||
limit:
|
||||
min: {x: 0, y: 0, z: 0}
|
||||
max: {x: 0, y: 0, z: 0}
|
||||
value: {x: 0, y: 0, z: 0}
|
||||
length: 0
|
||||
modified: 0
|
||||
- boneName: mixamorig:RightFoot
|
||||
humanName: RightFoot
|
||||
limit:
|
||||
min: {x: 0, y: 0, z: 0}
|
||||
max: {x: 0, y: 0, z: 0}
|
||||
value: {x: 0, y: 0, z: 0}
|
||||
length: 0
|
||||
modified: 0
|
||||
- boneName: mixamorig:Spine
|
||||
humanName: Spine
|
||||
limit:
|
||||
min: {x: 0, y: 0, z: 0}
|
||||
max: {x: 0, y: 0, z: 0}
|
||||
value: {x: 0, y: 0, z: 0}
|
||||
length: 0
|
||||
modified: 0
|
||||
- boneName: mixamorig:Spine1
|
||||
humanName: Chest
|
||||
limit:
|
||||
min: {x: 0, y: 0, z: 0}
|
||||
max: {x: 0, y: 0, z: 0}
|
||||
value: {x: 0, y: 0, z: 0}
|
||||
length: 0
|
||||
modified: 0
|
||||
- boneName: mixamorig:Neck
|
||||
humanName: Neck
|
||||
limit:
|
||||
min: {x: 0, y: 0, z: 0}
|
||||
max: {x: 0, y: 0, z: 0}
|
||||
value: {x: 0, y: 0, z: 0}
|
||||
length: 0
|
||||
modified: 0
|
||||
- boneName: mixamorig:Head
|
||||
humanName: Head
|
||||
limit:
|
||||
min: {x: 0, y: 0, z: 0}
|
||||
max: {x: 0, y: 0, z: 0}
|
||||
value: {x: 0, y: 0, z: 0}
|
||||
length: 0
|
||||
modified: 0
|
||||
- boneName: mixamorig:LeftShoulder
|
||||
humanName: LeftShoulder
|
||||
limit:
|
||||
min: {x: 0, y: 0, z: 0}
|
||||
max: {x: 0, y: 0, z: 0}
|
||||
value: {x: 0, y: 0, z: 0}
|
||||
length: 0
|
||||
modified: 0
|
||||
- boneName: mixamorig:RightShoulder
|
||||
humanName: RightShoulder
|
||||
limit:
|
||||
min: {x: 0, y: 0, z: 0}
|
||||
max: {x: 0, y: 0, z: 0}
|
||||
value: {x: 0, y: 0, z: 0}
|
||||
length: 0
|
||||
modified: 0
|
||||
- boneName: mixamorig:LeftArm
|
||||
humanName: LeftUpperArm
|
||||
limit:
|
||||
min: {x: 0, y: 0, z: 0}
|
||||
max: {x: 0, y: 0, z: 0}
|
||||
value: {x: 0, y: 0, z: 0}
|
||||
length: 0
|
||||
modified: 0
|
||||
- boneName: mixamorig:RightArm
|
||||
humanName: RightUpperArm
|
||||
limit:
|
||||
min: {x: 0, y: 0, z: 0}
|
||||
max: {x: 0, y: 0, z: 0}
|
||||
value: {x: 0, y: 0, z: 0}
|
||||
length: 0
|
||||
modified: 0
|
||||
- boneName: mixamorig:LeftForeArm
|
||||
humanName: LeftLowerArm
|
||||
limit:
|
||||
min: {x: 0, y: 0, z: 0}
|
||||
max: {x: 0, y: 0, z: 0}
|
||||
value: {x: 0, y: 0, z: 0}
|
||||
length: 0
|
||||
modified: 0
|
||||
- boneName: mixamorig:RightForeArm
|
||||
humanName: RightLowerArm
|
||||
limit:
|
||||
min: {x: 0, y: 0, z: 0}
|
||||
max: {x: 0, y: 0, z: 0}
|
||||
value: {x: 0, y: 0, z: 0}
|
||||
length: 0
|
||||
modified: 0
|
||||
- boneName: mixamorig:LeftHand
|
||||
humanName: LeftHand
|
||||
limit:
|
||||
min: {x: 0, y: 0, z: 0}
|
||||
max: {x: 0, y: 0, z: 0}
|
||||
value: {x: 0, y: 0, z: 0}
|
||||
length: 0
|
||||
modified: 0
|
||||
- boneName: mixamorig:RightHand
|
||||
humanName: RightHand
|
||||
limit:
|
||||
min: {x: 0, y: 0, z: 0}
|
||||
max: {x: 0, y: 0, z: 0}
|
||||
value: {x: 0, y: 0, z: 0}
|
||||
length: 0
|
||||
modified: 0
|
||||
- boneName: mixamorig:LeftToeBase
|
||||
humanName: LeftToes
|
||||
limit:
|
||||
min: {x: 0, y: 0, z: 0}
|
||||
max: {x: 0, y: 0, z: 0}
|
||||
value: {x: 0, y: 0, z: 0}
|
||||
length: 0
|
||||
modified: 0
|
||||
- boneName: mixamorig:RightToeBase
|
||||
humanName: RightToes
|
||||
limit:
|
||||
min: {x: 0, y: 0, z: 0}
|
||||
max: {x: 0, y: 0, z: 0}
|
||||
value: {x: 0, y: 0, z: 0}
|
||||
length: 0
|
||||
modified: 0
|
||||
- boneName: mixamorig:Spine2
|
||||
humanName: UpperChest
|
||||
limit:
|
||||
min: {x: 0, y: 0, z: 0}
|
||||
max: {x: 0, y: 0, z: 0}
|
||||
value: {x: 0, y: 0, z: 0}
|
||||
length: 0
|
||||
modified: 0
|
||||
skeleton:
|
||||
- name: "\u7CBE\u9510\u58EB\u5175\u5F85\u673A(Clone)"
|
||||
parentName:
|
||||
position: {x: 0, y: 0, z: 0}
|
||||
rotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
scale: {x: 1, y: 1, z: 1}
|
||||
- name: node_0
|
||||
parentName: "\u7CBE\u9510\u58EB\u5175\u5F85\u673A(Clone)"
|
||||
position: {x: -0, y: 0, z: 0}
|
||||
rotation: {x: 0, y: -0, z: -0, w: 1}
|
||||
scale: {x: 1, y: 1, z: 1}
|
||||
- name: mixamorig:Hips
|
||||
parentName: "\u7CBE\u9510\u58EB\u5175\u5F85\u673A(Clone)"
|
||||
position: {x: -0.000033298256, y: 0.0054881433, z: -0.00015930447}
|
||||
rotation: {x: 1.694066e-17, y: -0.00000002328306, z: 7.2759565e-10, w: 1}
|
||||
scale: {x: 1, y: 0.99999994, z: 1}
|
||||
- name: mixamorig:LeftUpLeg
|
||||
parentName: mixamorig:Hips
|
||||
position: {x: -0.00092088146, y: -0.00042003926, z: 0.000059175807}
|
||||
rotation: {x: -0.00008817942, y: 0.0016233503, z: 0.998526, w: 0.054251764}
|
||||
scale: {x: 1, y: 1.0000001, z: 1}
|
||||
- name: mixamorig:LeftLeg
|
||||
parentName: mixamorig:LeftUpLeg
|
||||
position: {x: -0, y: 0.0023731266, z: 0}
|
||||
rotation: {x: -0.0832822, y: 0.0022605017, z: -0.027038295, w: 0.9961566}
|
||||
scale: {x: 1.0000007, y: 1.0000005, z: 1.0000002}
|
||||
- name: mixamorig:LeftFoot
|
||||
parentName: mixamorig:LeftLeg
|
||||
position: {x: -0, y: 0.0018837228, z: 0}
|
||||
rotation: {x: 0.5345095, y: 0.08634181, z: -0.055010587, w: 0.8389389}
|
||||
scale: {x: 0.9999998, y: 0.99999976, z: 0.9999997}
|
||||
- name: mixamorig:LeftToeBase
|
||||
parentName: mixamorig:LeftFoot
|
||||
position: {x: 2.775558e-19, y: 0.0013880682, z: -1.387779e-19}
|
||||
rotation: {x: 0.27610147, y: 0.14435372, z: -0.041985013, w: 0.9492983}
|
||||
scale: {x: 1.0000002, y: 1.0000001, z: 1.0000001}
|
||||
- name: mixamorig:LeftToe_End
|
||||
parentName: mixamorig:LeftToeBase
|
||||
position: {x: -2.775558e-19, y: 0.0006292125, z: 0}
|
||||
rotation: {x: 0, y: -0, z: -0, w: 1}
|
||||
scale: {x: 1, y: 1, z: 1}
|
||||
- name: mixamorig:RightUpLeg
|
||||
parentName: mixamorig:Hips
|
||||
position: {x: 0.00092088146, y: -0.00042003926, z: 0.00012694088}
|
||||
rotation: {x: -0.00033617817, y: -0.006188621, z: 0.99850833, w: -0.05424697}
|
||||
scale: {x: 1.0000002, y: 1.0000002, z: 1}
|
||||
- name: mixamorig:RightLeg
|
||||
parentName: mixamorig:RightUpLeg
|
||||
position: {x: -0, y: 0.0023732947, z: 0}
|
||||
rotation: {x: -0.077806495, y: -0.0020960602, z: 0.026848923, w: 0.99660474}
|
||||
scale: {x: 1.0000004, y: 1.0000004, z: 0.99999994}
|
||||
- name: mixamorig:RightFoot
|
||||
parentName: mixamorig:RightLeg
|
||||
position: {x: 2.775558e-19, y: 0.0018851343, z: 1.387779e-19}
|
||||
rotation: {x: 0.5325873, y: -0.088806786, z: 0.05631869, w: 0.8398168}
|
||||
scale: {x: 0.99999994, y: 1, z: 0.9999999}
|
||||
- name: mixamorig:RightToeBase
|
||||
parentName: mixamorig:RightFoot
|
||||
position: {x: 2.775558e-19, y: 0.0013709535, z: 0}
|
||||
rotation: {x: 0.27998897, y: -0.15870824, z: 0.046991676, w: 0.9456267}
|
||||
scale: {x: 1.0000002, y: 1.0000004, z: 0.99999994}
|
||||
- name: mixamorig:RightToe_End
|
||||
parentName: mixamorig:RightToeBase
|
||||
position: {x: -0, y: 0.0005956813, z: -1.7347238e-20}
|
||||
rotation: {x: 0, y: -0, z: -0, w: 1}
|
||||
scale: {x: 1, y: 1, z: 1}
|
||||
- name: mixamorig:Spine
|
||||
parentName: mixamorig:Hips
|
||||
position: {x: -0, y: 0.0007542878, z: -0.000008376433}
|
||||
rotation: {x: -0.0055523063, y: -4.4446224e-11, z: 0.000000008003432, w: 0.9999846}
|
||||
scale: {x: 1, y: 1, z: 1}
|
||||
- name: mixamorig:Spine1
|
||||
parentName: mixamorig:Spine
|
||||
position: {x: -0, y: 0.0008800565, z: 0}
|
||||
rotation: {x: 4.6566123e-10, y: 0.000000023378584, z: -0.000000008472067, w: 1}
|
||||
scale: {x: 1, y: 1, z: 1.0000001}
|
||||
- name: mixamorig:Spine2
|
||||
parentName: mixamorig:Spine1
|
||||
position: {x: -0, y: 0.0010057794, z: 8.673619e-21}
|
||||
rotation: {x: 0.00000004610046, y: 0.0000000057234533, z: 0.000000008795248,
|
||||
w: 1}
|
||||
scale: {x: 1, y: 1, z: 0.9999999}
|
||||
- name: mixamorig:LeftShoulder
|
||||
parentName: mixamorig:Spine2
|
||||
position: {x: -0.0005729286, y: 0.0008236754, z: -0.0000016558962}
|
||||
rotation: {x: 0.5726584, y: -0.4144569, z: 0.57602423, w: 0.41046783}
|
||||
scale: {x: 1.0000002, y: 1.0000007, z: 1.0000006}
|
||||
- name: mixamorig:LeftArm
|
||||
parentName: mixamorig:LeftShoulder
|
||||
position: {x: -0, y: 0.0013687521, z: 1.1102232e-18}
|
||||
rotation: {x: -0.14070383, y: -0.051389083, z: 0.0134394765, w: 0.9886258}
|
||||
scale: {x: 0.99999994, y: 1.0000001, z: 1.0000001}
|
||||
- name: mixamorig:LeftForeArm
|
||||
parentName: mixamorig:LeftArm
|
||||
position: {x: -0, y: 0.0017869122, z: 0}
|
||||
rotation: {x: -0.009793237, y: -0.0065272637, z: -0.029940924, w: 0.99948245}
|
||||
scale: {x: 0.9999999, y: 0.9999998, z: 1.0000002}
|
||||
- name: mixamorig:LeftHand
|
||||
parentName: mixamorig:LeftForeArm
|
||||
position: {x: 1.387779e-19, y: 0.0018169561, z: 1.1102232e-18}
|
||||
rotation: {x: -0, y: -0, z: -0, w: 1}
|
||||
scale: {x: 1, y: 1, z: 1}
|
||||
- name: mixamorig:Neck
|
||||
parentName: mixamorig:Spine2
|
||||
position: {x: -0, y: 0.0011315017, z: 9.404087e-12}
|
||||
rotation: {x: 0.0055522597, y: 1.7763568e-15, z: -2.042458e-15, w: 0.9999846}
|
||||
scale: {x: 1, y: 0.99999994, z: 1.0000001}
|
||||
- name: mixamorig:Head
|
||||
parentName: mixamorig:Neck
|
||||
position: {x: -0, y: 0.00053630775, z: 0.00015199947}
|
||||
rotation: {x: 0.000000005587935, y: -0.0000000055479177, z: -0.000000007503331,
|
||||
w: 1}
|
||||
scale: {x: 0.99999994, y: 1, z: 1.0000001}
|
||||
- name: mixamorig:HeadTop_End
|
||||
parentName: mixamorig:Head
|
||||
position: {x: -0, y: 0.0011804049, z: 0.0003345484}
|
||||
rotation: {x: 0, y: -0, z: -0, w: 1}
|
||||
scale: {x: 1, y: 1, z: 1}
|
||||
- name: mixamorig:RightShoulder
|
||||
parentName: mixamorig:Spine2
|
||||
position: {x: 0.0005729286, y: 0.00082371454, z: -0.0000051805378}
|
||||
rotation: {x: -0.5733711, y: -0.41161546, z: 0.57535166, w: -0.413266}
|
||||
scale: {x: 1.0000001, y: 1.0000004, z: 1.0000002}
|
||||
- name: mixamorig:RightArm
|
||||
parentName: mixamorig:RightShoulder
|
||||
position: {x: -0, y: 0.0013687521, z: 2.2204464e-18}
|
||||
rotation: {x: 0.141276, y: -0.04089212, z: -0.0016786752, w: -0.98912394}
|
||||
scale: {x: 1.0000004, y: 1.0000006, z: 1.0000006}
|
||||
- name: mixamorig:RightForeArm
|
||||
parentName: mixamorig:RightArm
|
||||
position: {x: -0, y: 0.0017866485, z: 0}
|
||||
rotation: {x: -0.009310914, y: 0.0070107747, z: 0.030623745, w: 0.9994631}
|
||||
scale: {x: 1.0000005, y: 0.9999998, z: 1.0000001}
|
||||
- name: mixamorig:RightHand
|
||||
parentName: mixamorig:RightForeArm
|
||||
position: {x: -0, y: 0.0018190553, z: 0}
|
||||
rotation: {x: -0, y: -0, z: -9.3132246e-10, w: 1}
|
||||
scale: {x: 1.0000004, y: 1.0000002, z: 1.0000004}
|
||||
namedPoseList:
|
||||
- name: Default
|
||||
skeleton: []
|
||||
armTwist: 0.5
|
||||
foreArmTwist: 0.5
|
||||
upperLegTwist: 0.5
|
||||
legTwist: 0.5
|
||||
armStretch: 0.05
|
||||
legStretch: 0.05
|
||||
feetSpacing: 0
|
||||
globalScale: 1
|
||||
rootMotionBoneName:
|
||||
defaultPoseIndex: -1
|
||||
hasTranslationDoF: 0
|
||||
hasExtraRoot: 1
|
||||
skeletonHasParents: 1
|
||||
lastHumanDescriptionAvatarSource: {fileID: 9000000, guid: 62d9f853c067ff443bd2a3aa382ab563,
|
||||
type: 3}
|
||||
autoGenerateAvatarMappingIfUnspecified: 1
|
||||
animationType: 3
|
||||
humanoidOversampling: 1
|
||||
avatarSetup: 2
|
||||
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
|
||||
importBlendShapeDeformPercent: 1
|
||||
remapMaterialsIfMaterialImportModeIsNone: 0
|
||||
additionalBone: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -321,6 +321,7 @@ MonoBehaviour:
|
||||
indicatorHeight: 0.35
|
||||
stunIndicatorPrefab: {fileID: 2432573200162841629, guid: de288ea16be0c1544a4c6eb71e899570,
|
||||
type: 3}
|
||||
isStunImmune: 0
|
||||
--- !u!114 &7308248179790118654
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -372,13 +373,12 @@ MonoBehaviour:
|
||||
m_Script: {fileID: 11500000, guid: e1992c3d86e464205ac7d12ad4dbdff8, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
skillDamage: 125
|
||||
skillRadius: 2.5
|
||||
skillAnimationDuration: 2.22
|
||||
groundCrackEffectPrefab: {fileID: 1670833528851026573, guid: 066bbd566f6034806a29d1e0a6517df4,
|
||||
leapPeakHeight: 3.2
|
||||
landOffsetDistance: 0.9
|
||||
swordWavePrefab: {fileID: 1037878741696276, guid: 330c2a8758f34dd2a2ceea083c4bc2f8,
|
||||
type: 3}
|
||||
groundImpactPrefab: {fileID: 2197285705285267162, guid: c2264ab9308eec342a9aabba9e806a39,
|
||||
type: 3}
|
||||
groundCrackForwardDistance: 1.2
|
||||
groundCrackHeightOffset: 0.05
|
||||
--- !u!114 &1837549867983925736
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
|
||||
Binary file not shown.
@@ -83,16 +83,82 @@ public class CastleMageSkill : UnitSkill
|
||||
Debug.Log($"<color=orange>【爆裂火球】发射!</color> 伤害倍率: {damageMultiplier * 100:F0}%, 范围: {radius:F1}m (等级: {level})");
|
||||
}
|
||||
|
||||
private IEnumerator LaunchSecondFireballDelayed(GameObject target, float damageMultiplier, float radius, bool createBurnField)
|
||||
private IEnumerator LaunchSecondFireballDelayed(GameObject primaryTarget, float damageMultiplier, float radius, bool createBurnField)
|
||||
{
|
||||
yield return new WaitForSeconds(0.25f);
|
||||
if (target != null && target.activeInHierarchy && unit != null)
|
||||
if (unit == null) yield break;
|
||||
|
||||
// 优先打目标后方的敌人;如果只有一个怪或没有更后方的人,直接打同一个目标,绝不打空
|
||||
GameObject secondTarget = FindBacklineTarget(primaryTarget);
|
||||
|
||||
if (secondTarget != null && secondTarget.activeInHierarchy)
|
||||
{
|
||||
LaunchFireball(target, damageMultiplier, radius, createBurnField);
|
||||
Debug.Log($"<color=red>【双发爆裂】追加第二发火球!</color> 伤害倍率: {damageMultiplier * 100:F0}%");
|
||||
LaunchFireball(secondTarget, damageMultiplier, radius, createBurnField);
|
||||
bool isSameTarget = secondTarget == primaryTarget;
|
||||
Debug.Log($"<color=red>【双发爆裂】追加第二发火球!</color> 目标: {secondTarget.name} ({(isSameTarget ? "单目标连续轰炸" : "后排敌群轰炸")}),伤害倍率: {damageMultiplier * 100:F0}%");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 寻找位于当前目标后方的敌人。若无后排敌人,回退返回当前目标。
|
||||
/// </summary>
|
||||
private GameObject FindBacklineTarget(GameObject currentTarget)
|
||||
{
|
||||
if (unit == null) return currentTarget;
|
||||
|
||||
UnitTeam myTeam = unit.GetComponent<UnitTeam>();
|
||||
if (myTeam == null) return currentTarget;
|
||||
|
||||
// 如果原目标已失效/死亡,回退找任意当前有效目标
|
||||
if (currentTarget == null || !currentTarget.activeInHierarchy)
|
||||
{
|
||||
return unit.FindNearestEnemyForSkill();
|
||||
}
|
||||
|
||||
Vector3 magePos = unit.transform.position;
|
||||
Vector3 targetPos = currentTarget.transform.position;
|
||||
Vector3 forwardDir = (targetPos - magePos).normalized;
|
||||
if (forwardDir.sqrMagnitude < 0.001f) forwardDir = unit.transform.forward;
|
||||
|
||||
var allTeams = Object.FindObjectsOfType<UnitTeam>();
|
||||
GameObject bestBacklineTarget = null;
|
||||
float bestDistance = float.MaxValue;
|
||||
|
||||
foreach (var t in allTeams)
|
||||
{
|
||||
if (t == null || !t.gameObject.activeInHierarchy) continue;
|
||||
if (!myTeam.IsEnemy(t.gameObject)) continue;
|
||||
if (t.gameObject == currentTarget || t.transform.root == currentTarget.transform.root) continue;
|
||||
|
||||
// 检查敌方单位是否存活
|
||||
var targetUnit = t.GetComponentInParent<UnitBase>();
|
||||
if (targetUnit != null && targetUnit.IsDead) continue;
|
||||
var bar = t.GetComponentInParent<WorldHealthBar>();
|
||||
if (bar != null && bar.IsDead) continue;
|
||||
|
||||
GameObject enemyGo = targetUnit != null ? targetUnit.gameObject : t.gameObject;
|
||||
|
||||
// 计算该敌人相对当前目标的深度 (沿法师射向的距离)
|
||||
Vector3 offset = enemyGo.transform.position - targetPos;
|
||||
float depth = Vector3.Dot(offset, forwardDir);
|
||||
|
||||
// 只要位于目标后方 (深度 > 0.8米)
|
||||
if (depth > 0.8f)
|
||||
{
|
||||
// 优先选择距离当前目标最近的后排敌人(紧邻的后排敌群),形成层次分明的前后封锁
|
||||
float dist = offset.magnitude;
|
||||
if (dist < bestDistance)
|
||||
{
|
||||
bestDistance = dist;
|
||||
bestBacklineTarget = enemyGo;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 如果找到了后排敌人,打后排敌人;如果场上只有一个怪或无后排敌人,打同一个目标
|
||||
return bestBacklineTarget != null ? bestBacklineTarget : currentTarget;
|
||||
}
|
||||
|
||||
private void LaunchFireball(GameObject target, float damageMultiplier, float radius, bool createBurnField)
|
||||
{
|
||||
GameObject missilePrefab = fireballMissilePrefab;
|
||||
|
||||
@@ -1,71 +1,388 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.AI;
|
||||
|
||||
/// <summary>
|
||||
/// 精锐士兵技能:裂空突袭(刺客定位 · 1/3/6/10 级完整阶梯)
|
||||
/// 1级【裂空突袭】:核心招牌直接解锁!第一帧立刻起跳,空中划出高抛物线,30帧(约0.95s)落地砸击敌方后排,造成 200% 暴击物理伤害(播放 SwordWaveWhite)
|
||||
/// 3级【弱点锁定】:突袭伤害提升至 250%,暴击率额外 +25%,落地后 3 秒内自身移速 +35% 紧逼残血
|
||||
/// 6级【影袭破防】:突袭下砸震碎防御,目标陷入【1.2 秒硬眩晕】(挂 StunStars)且受到物理伤害增加 35%(持续 4s)
|
||||
/// 10级【死斗连环】:飞天斩若击杀目标,立即从当前落地点再次腾空飞斩下一个后排目标!最多连斩 3 次!
|
||||
/// </summary>
|
||||
public class EliteSoldierSkill : UnitSkill
|
||||
{
|
||||
[Header("蓄力重斩参数")]
|
||||
[Min(0f)]
|
||||
public float skillDamage = 125f;
|
||||
[Header("刺客飞跃参数")]
|
||||
[Tooltip("飞跃最高拱起高度")]
|
||||
public float leapPeakHeight = 3.5f;
|
||||
|
||||
[Min(0.1f)]
|
||||
public float skillRadius = 2.5f;
|
||||
[Tooltip("落地吸附距离")]
|
||||
public float landOffsetDistance = 0.8f;
|
||||
|
||||
[Header("技能动画")]
|
||||
[Min(0f)]
|
||||
public float skillAnimationDuration = 2.22f;
|
||||
[Tooltip("空中飞跃时长 (第1帧起跳到第30帧落地,精确为 0.95 秒)")]
|
||||
public float leapDuration = 0.95f;
|
||||
|
||||
[Header("特效")]
|
||||
public GameObject groundCrackEffectPrefab;
|
||||
[Min(0f)]
|
||||
public float groundCrackForwardDistance = 1.2f;
|
||||
[Min(0f)]
|
||||
public float groundCrackHeightOffset = 0.05f;
|
||||
[Header("特效资源")]
|
||||
public GameObject swordWavePrefab; // 落地白剑浪特效 (SwordWaveWhite)
|
||||
public GameObject groundImpactPrefab; // 落地冲击特效 (ShockwaveRing 或 TargetHitExplosion)
|
||||
|
||||
private bool isSkillReady;
|
||||
private bool isSkillPending = false;
|
||||
private GameObject leapTarget;
|
||||
private Coroutine leapCoroutine;
|
||||
private Coroutine consecutiveCoroutine;
|
||||
private int consecutiveKillCount = 0; // 10 级连斩计数 (最多 3 次)
|
||||
private bool prevRootMotionState = true;
|
||||
|
||||
public override void ReleaseSkill()
|
||||
private void EnsureUnit()
|
||||
{
|
||||
if (unit == null)
|
||||
{
|
||||
return;
|
||||
unit = GetComponent<UnitBase>();
|
||||
}
|
||||
|
||||
unit.FaceCurrentTarget(0f);
|
||||
isSkillReady = true;
|
||||
unit.PlaySkillAnimation(OnSkillFinished, skillAnimationDuration);
|
||||
}
|
||||
|
||||
// 添加到蓄力重斩动画的命中帧。
|
||||
public void OnSkillHit1()
|
||||
/// <summary>
|
||||
/// 当能量蓄满时触发:锁定敌方后排,启动飞天刺杀!
|
||||
/// </summary>
|
||||
public override void ReleaseSkill()
|
||||
{
|
||||
if (!isSkillReady)
|
||||
EnsureUnit();
|
||||
if (unit == null) return;
|
||||
|
||||
WorldHealthBar healthBar = unit.GetComponent<WorldHealthBar>();
|
||||
if (healthBar == null || healthBar.IsDead) return;
|
||||
|
||||
consecutiveKillCount = 0;
|
||||
ExecuteLeapAttack();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 执行一次飞天斩(第1帧起跳到第30帧落地)
|
||||
/// </summary>
|
||||
private void ExecuteLeapAttack()
|
||||
{
|
||||
EnsureUnit();
|
||||
if (unit == null) return;
|
||||
|
||||
// 刺客核心:优先锁定敌方后排最深处的活体敌人
|
||||
leapTarget = FindBacklineTarget(unit.Target);
|
||||
if (leapTarget == null)
|
||||
{
|
||||
RestoreAgentAndState();
|
||||
return;
|
||||
}
|
||||
|
||||
if (groundCrackEffectPrefab != null)
|
||||
Vector3 toTarget = leapTarget.transform.position - unit.transform.position;
|
||||
toTarget.y = 0f;
|
||||
if (toTarget.sqrMagnitude > 0.01f)
|
||||
{
|
||||
Vector3 effectPosition = unit.transform.position
|
||||
+ unit.transform.forward * groundCrackForwardDistance;
|
||||
effectPosition.y += groundCrackHeightOffset;
|
||||
unit.transform.rotation = Quaternion.LookRotation(toTarget.normalized, Vector3.up);
|
||||
}
|
||||
|
||||
GameObject effectObject = Instantiate(
|
||||
groundCrackEffectPrefab,
|
||||
effectPosition,
|
||||
groundCrackEffectPrefab.transform.rotation);
|
||||
isSkillPending = true;
|
||||
|
||||
ShockwaveRing shockwave = effectObject.GetComponent<ShockwaveRing>();
|
||||
if (shockwave != null)
|
||||
// 1. 关闭 NavMeshAgent 与 Root Motion,位移完全由抛物线代码接管,杜绝任何位移打架漂移
|
||||
NavMeshAgent agent = unit.GetComponent<NavMeshAgent>();
|
||||
if (agent != null && agent.enabled)
|
||||
{
|
||||
agent.enabled = false;
|
||||
}
|
||||
|
||||
Animator anim = GetComponent<Animator>();
|
||||
if (anim != null)
|
||||
{
|
||||
prevRootMotionState = anim.applyRootMotion;
|
||||
anim.applyRootMotion = false; // 飞天位移期间禁用根运动,防止动画位移叠加漂移
|
||||
anim.Play("skill", 0, 0f); // 强制从第 0 帧(第一帧立刻起跳)播放
|
||||
}
|
||||
|
||||
unit.PlaySkillAnimation(OnSkillAnimationFinished, 2.067f);
|
||||
|
||||
if (leapCoroutine != null) StopCoroutine(leapCoroutine);
|
||||
leapCoroutine = StartCoroutine(LeapTrajectoryRoutine(leapTarget));
|
||||
|
||||
Debug.Log($"<color=orange>【刺客·精锐士兵】第 {consecutiveKillCount + 1} 斩发动!</color> 第一帧腾空起跳,直扑后排: {leapTarget.name}");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 飞天抛物线协程:第 0 秒立刻起跳,0.95 秒(第30帧)精准落地
|
||||
/// </summary>
|
||||
private IEnumerator LeapTrajectoryRoutine(GameObject target)
|
||||
{
|
||||
Vector3 startPos = unit.transform.position;
|
||||
startPos.y = 0.16f; // 保证起跳起点严格贴地
|
||||
float elapsed = 0f;
|
||||
|
||||
while (elapsed < leapDuration)
|
||||
{
|
||||
elapsed += Time.deltaTime;
|
||||
float t = Mathf.Clamp01(elapsed / leapDuration);
|
||||
|
||||
// 获取后排目标当前坐标(支持目标位移时动态吸附)
|
||||
Vector3 targetPos = (target != null && target.activeInHierarchy)
|
||||
? target.transform.position
|
||||
: startPos + unit.transform.forward * 4f;
|
||||
|
||||
Vector3 toTargetVec = targetPos - startPos;
|
||||
Vector3 landTargetPos;
|
||||
|
||||
// 保持在目标身前适量距离落位,避免模型穿插
|
||||
if (toTargetVec.sqrMagnitude > landOffsetDistance * landOffsetDistance)
|
||||
{
|
||||
shockwave.Play();
|
||||
landTargetPos = targetPos - toTargetVec.normalized * landOffsetDistance;
|
||||
}
|
||||
else
|
||||
{
|
||||
landTargetPos = targetPos;
|
||||
}
|
||||
landTargetPos.y = 0.16f;
|
||||
|
||||
// 水平位置插值:使用匀速/平滑过渡
|
||||
Vector3 curPos = Vector3.Lerp(startPos, landTargetPos, t);
|
||||
|
||||
// 垂直抛物线:4 * H * t * (1 - t),在 t=0.5 (约第15帧/0.48s) 达到最高点 3.5 米
|
||||
curPos.y += 4f * leapPeakHeight * t * (1f - t);
|
||||
|
||||
unit.transform.position = curPos;
|
||||
|
||||
// 飞行中面朝目标
|
||||
Vector3 lookDir = landTargetPos - curPos;
|
||||
lookDir.y = 0f;
|
||||
if (lookDir.sqrMagnitude > 0.01f)
|
||||
{
|
||||
unit.transform.rotation = Quaternion.LookRotation(lookDir.normalized, Vector3.up);
|
||||
}
|
||||
|
||||
yield return null;
|
||||
}
|
||||
|
||||
// 第 0.95 秒(第30帧)精准落地
|
||||
Vector3 finalLandPos = unit.transform.position;
|
||||
finalLandPos.y = 0.16f;
|
||||
if (NavMesh.SamplePosition(finalLandPos, out NavMeshHit hit, 2.0f, NavMesh.AllAreas))
|
||||
{
|
||||
unit.transform.position = hit.position;
|
||||
}
|
||||
else
|
||||
{
|
||||
unit.transform.position = finalLandPos;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 动画命中帧方法:大剑落地砸击目标头顶 (约第 28~30 帧 / 0.904s 处)
|
||||
/// </summary>
|
||||
public void OnSkillHit1()
|
||||
{
|
||||
if (!isSkillPending) return;
|
||||
isSkillPending = false;
|
||||
|
||||
EnsureUnit();
|
||||
if (unit == null) return;
|
||||
|
||||
GameObject opponent = (leapTarget != null && leapTarget.activeInHierarchy) ? leapTarget : unit.Target;
|
||||
if (opponent == null) return;
|
||||
|
||||
int level = unit.level;
|
||||
|
||||
// 1. 播放破空剑浪与地面冲击特效
|
||||
PlayImpactVfx(opponent.transform.position);
|
||||
|
||||
// 2. 计算刺客伤害 (1级 200%, 3级+ 250%)
|
||||
float damageMultiplier = level >= 3 ? 2.50f : 2.00f;
|
||||
|
||||
// 3级解锁:暴击率额外 +25%
|
||||
float originalCrit = unit.critRate;
|
||||
if (level >= 3)
|
||||
{
|
||||
unit.critRate += 0.25f;
|
||||
}
|
||||
|
||||
UnitBase targetUnit = opponent.GetComponentInParent<UnitBase>();
|
||||
WorldHealthBar targetBar = opponent.GetComponentInParent<WorldHealthBar>();
|
||||
if (targetBar == null && targetUnit != null)
|
||||
{
|
||||
targetBar = targetUnit.GetComponent<WorldHealthBar>();
|
||||
}
|
||||
|
||||
// 施加技能重劈伤害
|
||||
float damage = unit.attackPower * damageMultiplier;
|
||||
if (targetUnit != null)
|
||||
{
|
||||
targetUnit.ReceiveDamage(damage, unit.gameObject);
|
||||
}
|
||||
else if (targetBar != null)
|
||||
{
|
||||
targetBar.TakeDamage(damage, unit.gameObject);
|
||||
}
|
||||
|
||||
// 恢复暴击率
|
||||
if (level >= 3)
|
||||
{
|
||||
unit.critRate = originalCrit;
|
||||
// 3级解锁:落地后 3 秒移速 +35%
|
||||
StartCoroutine(TemporarySpeedBoostRoutine(3.0f, 1.35f));
|
||||
}
|
||||
|
||||
// 3. 6级解锁【影袭破防】:目标陷入 1.2 秒硬眩晕
|
||||
if (level >= 6 && targetUnit != null && targetUnit.IsAlive)
|
||||
{
|
||||
targetUnit.ApplyStun(1.2f);
|
||||
Debug.Log($"<color=yellow>【影袭破防】命中!</color> 目标 {targetUnit.gameObject.name} 被震晕 1.2 秒!");
|
||||
}
|
||||
|
||||
Debug.Log($"<color=orange>【裂空突袭】大剑劈中后排!</color> 造成伤害倍率: {damageMultiplier * 100:F0}% (等级: {level})");
|
||||
|
||||
// 4. 10级解锁【死斗连环】:若斩杀目标,短暂停顿 0.25 秒后立即无缝起跳下一个后排!
|
||||
bool isTargetKilled = (targetBar != null && targetBar.IsDead) || (targetUnit != null && targetUnit.IsDead) || (targetBar != null && targetBar.currentHealth <= 0f);
|
||||
if (level >= 10 && isTargetKilled)
|
||||
{
|
||||
consecutiveKillCount++;
|
||||
if (consecutiveKillCount < 3)
|
||||
{
|
||||
Debug.Log($"<color=red>【死斗连环】斩杀触发!</color> 精锐士兵斩杀后排目标,准备连斩下一个后排!(连击: {consecutiveKillCount})");
|
||||
if (consecutiveCoroutine != null) StopCoroutine(consecutiveCoroutine);
|
||||
consecutiveCoroutine = StartCoroutine(TriggerNextConsecutiveLeapDelayed(0.25f));
|
||||
}
|
||||
else
|
||||
{
|
||||
consecutiveKillCount = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
consecutiveKillCount = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 连斩平滑衔接:后摇停顿 0.25 秒(让玩家看清落地砍杀),随后直接从当前落地位置再次腾空!
|
||||
/// </summary>
|
||||
private IEnumerator TriggerNextConsecutiveLeapDelayed(float delay)
|
||||
{
|
||||
yield return new WaitForSeconds(delay);
|
||||
|
||||
if (unit != null && unit.IsAlive)
|
||||
{
|
||||
ExecuteLeapAttack();
|
||||
}
|
||||
}
|
||||
|
||||
private IEnumerator TemporarySpeedBoostRoutine(float duration, float mult)
|
||||
{
|
||||
if (unit == null) yield break;
|
||||
float originalSpeed = unit.speed;
|
||||
unit.speed = originalSpeed * mult;
|
||||
|
||||
yield return new WaitForSeconds(duration);
|
||||
|
||||
if (unit != null)
|
||||
{
|
||||
unit.speed = originalSpeed;
|
||||
}
|
||||
}
|
||||
|
||||
private void PlayImpactVfx(Vector3 landPos)
|
||||
{
|
||||
// 1. 播放 SwordWaveWhite 白剑浪 (贴地平铺)
|
||||
GameObject wavePrefab = swordWavePrefab;
|
||||
#if UNITY_EDITOR
|
||||
if (wavePrefab == null)
|
||||
{
|
||||
wavePrefab = UnityEditor.AssetDatabase.LoadAssetAtPath<GameObject>("Assets/TJGeneratorLibEffects/Prefabs/Combat/Sword/Wave/SwordWaveWhite.prefab");
|
||||
}
|
||||
#endif
|
||||
if (wavePrefab != null && unit != null)
|
||||
{
|
||||
Vector3 vfxPos = landPos + Vector3.up * 0.2f;
|
||||
Quaternion rot = Quaternion.Euler(0f, unit.transform.eulerAngles.y, 0f);
|
||||
var vfx = Instantiate(wavePrefab, vfxPos, rot);
|
||||
vfx.transform.rotation = rot;
|
||||
vfx.transform.localScale = Vector3.one * 1.5f;
|
||||
Destroy(vfx, 1.5f);
|
||||
}
|
||||
|
||||
// 2. 播放地面震波光圈
|
||||
GameObject impactPrefab = groundImpactPrefab;
|
||||
#if UNITY_EDITOR
|
||||
if (impactPrefab == null)
|
||||
{
|
||||
impactPrefab = UnityEditor.AssetDatabase.LoadAssetAtPath<GameObject>("Assets/Prefabs/特效/扩散光圈/ShockwaveRing.prefab");
|
||||
}
|
||||
#endif
|
||||
if (impactPrefab != null)
|
||||
{
|
||||
var ring = Instantiate(impactPrefab, new Vector3(landPos.x, 0.05f, landPos.z), impactPrefab.transform.rotation);
|
||||
Destroy(ring, 1.5f);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 寻找敌方阵型最远端/最深处的后排存活敌人
|
||||
/// </summary>
|
||||
private GameObject FindBacklineTarget(GameObject currentTarget)
|
||||
{
|
||||
if (unit == null) return currentTarget;
|
||||
UnitTeam myTeam = unit.GetComponent<UnitTeam>();
|
||||
|
||||
var allTeams = Object.FindObjectsOfType<UnitTeam>();
|
||||
GameObject furthestBacklineEnemy = null;
|
||||
float maxDepth = -999f;
|
||||
|
||||
foreach (var t in allTeams)
|
||||
{
|
||||
if (t == null || !t.gameObject.activeInHierarchy) continue;
|
||||
|
||||
// 双重防呆判断:支持 UnitTeam 阵营比对与 Unity Tag 敌我比对
|
||||
bool isEnemy = (myTeam != null && myTeam.IsEnemy(t.gameObject))
|
||||
|| (unit.CompareTag("Friend") && (t.CompareTag("Enemy") || t.gameObject.name.Contains("小怪") || t.gameObject.name.Contains("敌方")));
|
||||
if (!isEnemy) continue;
|
||||
|
||||
var targetUnit = t.GetComponentInParent<UnitBase>();
|
||||
if (targetUnit != null && targetUnit.IsDead) continue;
|
||||
var bar = t.GetComponentInParent<WorldHealthBar>();
|
||||
if (bar != null && bar.IsDead) continue;
|
||||
|
||||
GameObject enemyGo = targetUnit != null ? targetUnit.gameObject : t.gameObject;
|
||||
|
||||
// 依据战场纵深 (Z 坐标越大即越靠后排敌方阵地)
|
||||
float depth = enemyGo.transform.position.z;
|
||||
if (depth > maxDepth)
|
||||
{
|
||||
maxDepth = depth;
|
||||
furthestBacklineEnemy = enemyGo;
|
||||
}
|
||||
}
|
||||
|
||||
unit.ApplyAreaSkillDamage(skillRadius, skillDamage, false);
|
||||
isSkillReady = false;
|
||||
return furthestBacklineEnemy != null ? furthestBacklineEnemy : currentTarget;
|
||||
}
|
||||
|
||||
private void OnSkillFinished()
|
||||
private void RestoreAgentAndState()
|
||||
{
|
||||
isSkillReady = false;
|
||||
isSkillPending = false;
|
||||
|
||||
NavMeshAgent agent = unit != null ? unit.GetComponent<NavMeshAgent>() : null;
|
||||
if (agent != null && !agent.enabled)
|
||||
{
|
||||
agent.enabled = true;
|
||||
}
|
||||
|
||||
Animator anim = GetComponent<Animator>();
|
||||
if (anim != null)
|
||||
{
|
||||
anim.applyRootMotion = prevRootMotionState;
|
||||
}
|
||||
}
|
||||
|
||||
private void OnSkillAnimationFinished()
|
||||
{
|
||||
RestoreAgentAndState();
|
||||
}
|
||||
|
||||
private void OnDestroy()
|
||||
{
|
||||
if (leapCoroutine != null) StopCoroutine(leapCoroutine);
|
||||
if (consecutiveCoroutine != null) StopCoroutine(consecutiveCoroutine);
|
||||
RestoreAgentAndState();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:yousandi.cn,2023:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 8
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: slash02_ADD
|
||||
m_Shader: {fileID: 211, guid: 0000000000000000f000000000000000, type: 0}
|
||||
m_Parent: {fileID: 0}
|
||||
m_ModifiedSerializedProperties: 0
|
||||
m_ValidKeywords:
|
||||
- _ALPHABLEND_ON
|
||||
- _FADING_ON
|
||||
m_InvalidKeywords: []
|
||||
m_LightmapFlags: 0
|
||||
m_EnableInstancingVariants: 0
|
||||
m_DoubleSidedGI: 0
|
||||
m_CustomRenderQueue: 3000
|
||||
stringTagMap:
|
||||
RenderType: Transparent
|
||||
disabledShaderPasses:
|
||||
- GRABPASS
|
||||
m_LockedProperties:
|
||||
m_SavedProperties:
|
||||
serializedVersion: 3
|
||||
m_TexEnvs:
|
||||
- _BumpMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _EmissionMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MainTex:
|
||||
m_Texture: {fileID: 2800000, guid: 69db99367b0c40ebae547e24e0a12f67, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Ints: []
|
||||
m_Floats:
|
||||
- _BlendOp: 0
|
||||
- _BumpScale: 1
|
||||
- _CameraFadingEnabled: 0
|
||||
- _CameraFarFadeDistance: 2
|
||||
- _CameraNearFadeDistance: 1
|
||||
- _ColorMode: 0
|
||||
- _Cull: 0
|
||||
- _Cutoff: 0.5
|
||||
- _DistortionBlend: 0.5
|
||||
- _DistortionEnabled: 0
|
||||
- _DistortionStrength: 1
|
||||
- _DistortionStrengthScaled: 0
|
||||
- _DstBlend: 1
|
||||
- _EmissionEnabled: 0
|
||||
- _FlipbookMode: 0
|
||||
- _InvFade: 1
|
||||
- _LightingEnabled: 0
|
||||
- _Mode: 4
|
||||
- _SoftParticlesEnabled: 1
|
||||
- _SoftParticlesFarFadeDistance: 0.2
|
||||
- _SoftParticlesNearFadeDistance: 0
|
||||
- _SrcBlend: 5
|
||||
- _ZWrite: 0
|
||||
m_Colors:
|
||||
- _CameraFadeParams: {r: 0, g: Infinity, b: 0, a: 0}
|
||||
- _Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _ColorAddSubDiff: {r: 0, g: 0, b: 0, a: 0}
|
||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
||||
- _SoftParticleFadeParams: {r: 0, g: 5, b: 0, a: 0}
|
||||
- _TintColor: {r: 0.5, g: 0.5, b: 0.5, a: 0.5}
|
||||
m_BuildTextureStacks: []
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 44d0c0871cb54a20bf626ee7dc94bff9
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 2100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@@ -0,0 +1,92 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d76077da67bb40d4bbeb5ede10ec9474
|
||||
ModelImporter:
|
||||
serializedVersion: 22
|
||||
fileIDToRecycleName:
|
||||
100000: //RootNode
|
||||
400000: //RootNode
|
||||
2100000: No Name
|
||||
2300000: //RootNode
|
||||
3300000: //RootNode
|
||||
4300000: ETFX_CirclePlaneHalf
|
||||
9500000: //RootNode
|
||||
externalObjects: {}
|
||||
materials:
|
||||
importMaterials: 1
|
||||
materialName: 0
|
||||
materialSearch: 1
|
||||
materialLocation: 1
|
||||
animations:
|
||||
legacyGenerateAnimations: 4
|
||||
bakeSimulation: 0
|
||||
resampleCurves: 1
|
||||
optimizeGameObjects: 0
|
||||
motionNodeName:
|
||||
rigImportErrors:
|
||||
rigImportWarnings:
|
||||
animationImportErrors:
|
||||
animationImportWarnings:
|
||||
animationRetargetingWarnings:
|
||||
animationDoRetargetingWarnings: 0
|
||||
importAnimatedCustomProperties: 0
|
||||
animationCompression: 1
|
||||
animationRotationError: 0.5
|
||||
animationPositionError: 0.5
|
||||
animationScaleError: 0.5
|
||||
animationWrapMode: 0
|
||||
extraExposedTransformPaths: []
|
||||
extraUserProperties: []
|
||||
clipAnimations: []
|
||||
isReadable: 1
|
||||
meshes:
|
||||
lODScreenPercentages: []
|
||||
globalScale: 1.7
|
||||
meshCompression: 0
|
||||
addColliders: 0
|
||||
importVisibility: 1
|
||||
importBlendShapes: 1
|
||||
importCameras: 1
|
||||
importLights: 1
|
||||
swapUVChannels: 0
|
||||
generateSecondaryUV: 0
|
||||
useFileUnits: 1
|
||||
optimizeMeshForGPU: 1
|
||||
keepQuads: 0
|
||||
weldVertices: 1
|
||||
preserveHierarchy: 0
|
||||
indexFormat: 0
|
||||
secondaryUVAngleDistortion: 8
|
||||
secondaryUVAreaDistortion: 15.000001
|
||||
secondaryUVHardAngle: 88
|
||||
secondaryUVPackMargin: 4
|
||||
useFileScale: 1
|
||||
tangentSpace:
|
||||
normalSmoothAngle: 60
|
||||
normalImportMode: 0
|
||||
tangentImportMode: 3
|
||||
normalCalculationMode: 4
|
||||
importAnimation: 1
|
||||
copyAvatar: 0
|
||||
humanDescription:
|
||||
serializedVersion: 2
|
||||
human: []
|
||||
skeleton: []
|
||||
armTwist: 0.5
|
||||
foreArmTwist: 0.5
|
||||
upperLegTwist: 0.5
|
||||
legTwist: 0.5
|
||||
armStretch: 0.05
|
||||
legStretch: 0.05
|
||||
feetSpacing: 0
|
||||
rootMotionBoneName:
|
||||
rootMotionBoneRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
hasTranslationDoF: 0
|
||||
hasExtraRoot: 0
|
||||
skeletonHasParents: 1
|
||||
lastHumanDescriptionAvatarSource: {instanceID: 0}
|
||||
animationType: 2
|
||||
humanoidOversampling: 1
|
||||
additionalBone: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: DX0Z5yL4AXNEKl91aBRnsnrs5EOGqiEuJWgGTftya2Mv6LG+qHfzxJ4=
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 330c2a8758f34dd2a2ceea083c4bc2f8
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 100100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 45 KiB |
@@ -0,0 +1,116 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 69db99367b0c40ebae547e24e0a12f67
|
||||
TextureImporter:
|
||||
fileIDToRecycleName: {}
|
||||
externalObjects: {}
|
||||
serializedVersion: 4
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
isReadable: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: -1
|
||||
aniso: -1
|
||||
mipBias: -1
|
||||
wrapU: -1
|
||||
wrapV: -1
|
||||
wrapW: -1
|
||||
nPOTScale: 1
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 0
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 1
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 0
|
||||
textureShape: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
platformSettings:
|
||||
- buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
- buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
- buildTarget: Android
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
- buildTarget: Windows Store Apps
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
- buildTarget: WebGL
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
spritePackingTag:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -33,6 +33,7 @@
|
||||
- [2026-10-02 00:03:51] UnitBase fields: use unit.Camp (property), unit.IsAlive (property), NOT unit.camp or unit.isAlive (do not exist). StatusEffectController is private — access stun logic through public UnitBase methods only
|
||||
- [2026-10-06 22:02:42] BuffSelectionController 卡牌 UI 边框修改规则:BuffCard 下 buffImage 节点的 RectTransform、Scale 和 Position 均由用户在 Unity Editor 中手工调整确定,脚本只能修改 borderImage.sprite 动态替换边框贴图,绝对不要在代码中重置或修改 transform 属性。
|
||||
- [2026-10-10 21:12:09] 全新克隆/换仓库后出现大量Missing Script或脚本存在但报错未挂载时,通常是Unity脚本导入未绑定(MonoScript.GetClass为空),需对Assets/Scripts批量AssetDatabase.ImportAsset(ForceUpdate)刷新绑定,而非直接重构代码。
|
||||
- [2026-10-12 22:31:19] 2026-10-12 英雄阶梯技能设计铁律:1级技能必须直接确立角色核心职业定位(如刺客1级即飞天突袭后排,法师1级即爆裂火球,盾卫1级即圣盾护体),3级数值与机动强化,6级战术控制质变,10级大招高光连招;绝不可等到3级才确立核心职业机制。
|
||||
|
||||
### Project
|
||||
- [2026-08-28 14:26:56] 弓箭手远程箭矢的设计要求:保持发射时高度水平飞行,命中目标后直接结算伤害并销毁,不产生实体物理击退。**Why:** 当前玩法希望远程攻击是命中判定而非物理推动。**How to apply:** 后续调整箭矢、Projectile 或弓箭手攻击逻辑时保持这一行为。
|
||||
@@ -155,6 +156,7 @@
|
||||
- [2026-10-11 22:44:10] 2026-10-11 盾卫技能实装完毕:ShieldGuardSkill.cs 接入 1/3/6/10 级阶梯体系。1级35%护盾(MagicShieldBlue)、3级50%护盾且延长至6s、6级OnSkillHit1事件帧拍地爆发NovaBlue声波环并强制嘲讽周围4米敌人3秒(UnitBase.ApplyTaunt)、10级霸体免控(StatusEffectController.isStunImmune)且破盾/超时爆发NovaLightningBlue反弹50%吸收量范围伤害(UnitBase.ApplyAreaSkillDamage)。CharacterTest场景与盾卫预制体已完成绑定与PlayMode验证。
|
||||
- [2026-10-11 23:40:59] 2026-10-11 人类士兵技能实装完毕:HumanSoldierSkill.cs 接入 1/3/6/10 级阶梯体系。1级150%伤害配合SwordSlashThickWhite剑气、3级190%伤害且技能暴击率+20%、6级OnSkillHit1命中直接施加1.2秒断岳重击眩晕(ApplyStun+StunStars)、10级生命值首次跌破35%触发不屈战魂(AuraSoftBlue光环平铺地面,攻速+60%且普攻30%吸血持续6s)。已完成全流程PlayMode测试。Quad光环类地面特效实例化必须继承其Prefab自身X轴-90度(270度)旋转以保持平铺贴地。
|
||||
- [2026-10-12 17:01:19] 2026-10-12 法师重构为阶梯技能体系 (CastleMageSkill.cs),包含 FireballSharpMissileFire 飞弹、MagicExplosionFire 爆破及 FireFieldRed 地面持续灼烧火海特效。
|
||||
- [2026-10-12 22:31:36] 2026-10-12 精锐士兵刺客重构完毕:EliteSoldierSkill.cs 实现1级直接飞天斩后排(跃起劈砍.fbx第0帧立刻起跳、0.95s第30帧精准落地扑向敌方最远后排重劈200%);3级250%伤害且落地+35%移速;6级影袭破防眩晕1.2s;10级击杀目标后0.25s立即再次腾空连斩下一个后排(最多3连斩)。飞跃期间必须关闭 animator.applyRootMotion = false 与 navAgent.enabled = false,彻底消除动画根运动与抛物线位移打架造成的连斩异常漂移。
|
||||
|
||||
### Reference
|
||||
- [2026-09-09 12:23:17] 飞行物脚本 Projectile.cs 负责锁敌追踪、碰撞检测和伤害结算。箭矢预制体 ArrowProjectile_White.prefab 已配置 Projectile 组件和 CapsuleCollider(Is Trigger)。远程单位需在攻击动画松弦帧添加 OnAttackEffect Event,并在 UnitBase 中设置 attackType=RangedProjectile、projectilePrefab、projectileSpawnPoint。
|
||||
+1
-1
@@ -326,7 +326,7 @@ UnitBase
|
||||
| **人类士兵**<br>*(坚韧重战/背水一战)* | **蓄力重斩**:挥舞短剑蓄力重劈,对前方单体敌人造成 **150% 物理伤害**(带短白剑气 `SwordSlashThickWhite`) | 重斩暴击率 +20%,基础伤害提升至 **190%** | **断岳重击**:重斩附带强力震慑,命中直接使目标**眩晕 1.2 秒**(挂 `StunStars` 星星),精准打断敌人蓄力! | **不屈战魂**:生命值首次跌破 35% 时进入无畏状态(脚底光环 `AuraSoftBlue`),**攻速 +60% 且普攻附带 30% 吸血**,持续 6 秒绝地翻盘! |
|
||||
| **弓箭手**<br>*(狙击点杀/后排压制)* | **迅捷三连**:搭弓连续高速射出 **3 支穿甲箭矢**,单体快速倾泻火力 | 箭矢飞行速度 +35%,三连射总伤害提升 **25%** | **追踪引信**:箭矢获得弧线微调追踪轨迹;且第 3 支箭命中时附带破甲标记,使目标**受到的所有伤害 +30%(持续 4s)** | **乱射风暴**:三连射升级为 **6 支风暴连射**;击杀目标后剩余箭矢自动散开弹射给周围其他敌人,兼顾单体点杀与残血收割! |
|
||||
| **城堡法师**<br>*(轰炸火法/阵地火海)* | **爆裂火球**:吟唱发射一颗烈焰飞弹(`FireballSharpMissileFire`),命中造成 **160% 范围伤害**(`MagicExplosionFire`) | 火球爆破半径扩大 30%,爆破中心伤害提升至 **200%** | **焦土火海**:火球爆炸处在地面留下一片燃烧焦土,对踏入火海的敌人**每秒造成 30% 攻击力的持续引燃**(持续 4 秒) | **双重轰炸**:释放技能瞬间**连续轰出 2 颗烈焰巨球**!第二颗轰炸在更深处的后排敌群,双重火海前后封锁战场! |
|
||||
| **精锐士兵**<br>*(大剑狂战/顺劈收割)* | **半月顺劈**:挥舞双手大剑横扫,对前方扇形区域内所有敌人造成 **160% 范围伤害**(弧形白剑浪 `SwordWaveWhite`) | 顺劈扇形角度扩大至 180 度,伤害提升至 **210%** | **巨力破甲**:横扫附带重甲压制,被顺劈击中的全部敌人**护甲降低 40% 且移速降低 40%(持续 3 秒)** | **处决连斩**:顺劈命中若直接斩杀任意敌人,**立即无视能量充能再次触发一次免费顺劈**!最多连续处决 3 次,小怪群一刀倒一片! |
|
||||
| **精锐士兵**<br>*(刺客/飞天切后排)* | **裂空突袭**:核心招牌直接解锁!双手持大剑高高跃起飞扑敌方后排最深处敌人,落地重劈造成 **200% 物理暴击伤害**(带剑浪 `SwordWaveWhite`)!直接绕开前排肉盾直取后排! | **弱点锁定**:突袭伤害提升至 **250%**,暴击率额外 **+25%**,落地后 3 秒内自身移速 +35% 方便就地追杀残血! | **影袭破防**:飞天重劈落地附带强力震慑,使目标**眩晕 1.2 秒**(挂 `StunStars`)且受到物理伤害增加 35%(持续 4s)! | **死斗连环**:飞天斩若击杀目标,**立即刷新技能充能**并自动再次腾空扑向下一个后排目标!最多连续连斩 3 次,后排杀手! |
|
||||
|
||||
### 11.2 第二章英雄技能阶梯解锁表
|
||||
|
||||
|
||||
Reference in new issue
Block a user