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:
huadexuan committed 2026-10-12 23:10:06 +08:00
1 parent ec35c6c154
commit a9869b7419
18 files changed
+25041 -51

No files matched your search

@@ -23,5 +23,5 @@ AnimatorOverrideController:
type: 3} type: 3}
- m_OriginalClip: {fileID: -203655887218126122, guid: b82d15855591849bd80b62238bcd4ed3, - m_OriginalClip: {fileID: -203655887218126122, guid: b82d15855591849bd80b62238bcd4ed3,
type: 3} type: 3}
m_OverrideClip: {fileID: -203655887218126122, guid: aedcf7ed294f23b489dc19f0da73d5a9, m_OverrideClip: {fileID: -203655887218126122, guid: 1f1437cb5f60a45b5add7f1802c087f7,
type: 3} 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:
+6 -6
View File
@@ -321,6 +321,7 @@ MonoBehaviour:
indicatorHeight: 0.35 indicatorHeight: 0.35
stunIndicatorPrefab: {fileID: 2432573200162841629, guid: de288ea16be0c1544a4c6eb71e899570, stunIndicatorPrefab: {fileID: 2432573200162841629, guid: de288ea16be0c1544a4c6eb71e899570,
type: 3} type: 3}
isStunImmune: 0
--- !u!114 &7308248179790118654 --- !u!114 &7308248179790118654
MonoBehaviour: MonoBehaviour:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -372,13 +373,12 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: e1992c3d86e464205ac7d12ad4dbdff8, type: 3} m_Script: {fileID: 11500000, guid: e1992c3d86e464205ac7d12ad4dbdff8, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
skillDamage: 125 leapPeakHeight: 3.2
skillRadius: 2.5 landOffsetDistance: 0.9
skillAnimationDuration: 2.22 swordWavePrefab: {fileID: 1037878741696276, guid: 330c2a8758f34dd2a2ceea083c4bc2f8,
groundCrackEffectPrefab: {fileID: 1670833528851026573, guid: 066bbd566f6034806a29d1e0a6517df4, type: 3}
groundImpactPrefab: {fileID: 2197285705285267162, guid: c2264ab9308eec342a9aabba9e806a39,
type: 3} type: 3}
groundCrackForwardDistance: 1.2
groundCrackHeightOffset: 0.05
--- !u!114 &1837549867983925736 --- !u!114 &1837549867983925736
MonoBehaviour: MonoBehaviour:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
Binary file not shown.
+70 -4
View File
@@ -83,16 +83,82 @@ public class CastleMageSkill : UnitSkill
Debug.Log($"<color=orange>【爆裂火球】发射!</color> 伤害倍率: {damageMultiplier * 100:F0}%, 范围: {radius:F1}m (等级: {level})"); 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); 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); LaunchFireball(secondTarget, damageMultiplier, radius, createBurnField);
Debug.Log($"<color=red>【双发爆裂】追加第二发火球!</color> 伤害倍率: {damageMultiplier * 100:F0}%"); 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) private void LaunchFireball(GameObject target, float damageMultiplier, float radius, bool createBurnField)
{ {
GameObject missilePrefab = fireballMissilePrefab; GameObject missilePrefab = fireballMissilePrefab;
+356 -39
View File
@@ -1,71 +1,388 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine; 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 public class EliteSoldierSkill : UnitSkill
{ {
[Header("蓄力重斩参数")] [Header("刺客飞跃参数")]
[Min(0f)] [Tooltip("飞跃最高拱起高度")]
public float skillDamage = 125f; public float leapPeakHeight = 3.5f;
[Min(0.1f)] [Tooltip("落地吸附距离")]
public float skillRadius = 2.5f; public float landOffsetDistance = 0.8f;
[Header("技能动画")] [Tooltip("空中飞跃时长 (第1帧起跳到第30帧落地,精确为 0.95 秒)")]
[Min(0f)] public float leapDuration = 0.95f;
public float skillAnimationDuration = 2.22f;
[Header("特效")] [Header("特效资源")]
public GameObject groundCrackEffectPrefab; public GameObject swordWavePrefab; // 落地白剑浪特效 (SwordWaveWhite)
[Min(0f)] public GameObject groundImpactPrefab; // 落地冲击特效 (ShockwaveRing 或 TargetHitExplosion)
public float groundCrackForwardDistance = 1.2f;
[Min(0f)]
public float groundCrackHeightOffset = 0.05f;
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) if (unit == null)
{ {
return; unit = GetComponent<UnitBase>();
} }
unit.FaceCurrentTarget(0f);
isSkillReady = true;
unit.PlaySkillAnimation(OnSkillFinished, skillAnimationDuration);
} }
// 添加到蓄力重斩动画的命中帧。 /// <summary>
public void OnSkillHit1() /// 当能量蓄满时触发:锁定敌方后排,启动飞天刺杀!
/// </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; 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.rotation = Quaternion.LookRotation(toTarget.normalized, Vector3.up);
+ unit.transform.forward * groundCrackForwardDistance; }
effectPosition.y += groundCrackHeightOffset;
GameObject effectObject = Instantiate( isSkillPending = true;
groundCrackEffectPrefab,
effectPosition,
groundCrackEffectPrefab.transform.rotation);
ShockwaveRing shockwave = effectObject.GetComponent<ShockwaveRing>(); // 1. 关闭 NavMeshAgent 与 Root Motion,位移完全由抛物线代码接管,杜绝任何位移打架漂移
if (shockwave != null) 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); return furthestBacklineEnemy != null ? furthestBacklineEnemy : currentTarget;
isSkillReady = false;
} }
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:
@@ -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:
+2
View File
@@ -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-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-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-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 ### Project
- [2026-08-28 14:26:56] 弓箭手远程箭矢的设计要求:保持发射时高度水平飞行,命中目标后直接结算伤害并销毁,不产生实体物理击退。**Why:** 当前玩法希望远程攻击是命中判定而非物理推动。**How to apply:** 后续调整箭矢、Projectile 或弓箭手攻击逻辑时保持这一行为。 - [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 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-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 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 ### Reference
- [2026-09-09 12:23:17] 飞行物脚本 Projectile.cs 负责锁敌追踪、碰撞检测和伤害结算。箭矢预制体 ArrowProjectile_White.prefab 已配置 Projectile 组件和 CapsuleCollider(Is Trigger)。远程单位需在攻击动画松弦帧添加 OnAttackEffect Event,并在 UnitBase 中设置 attackType=RangedProjectile、projectilePrefab、projectileSpawnPoint。 - [2026-09-09 12:23:17] 飞行物脚本 Projectile.cs 负责锁敌追踪、碰撞检测和伤害结算。箭矢预制体 ArrowProjectile_White.prefab 已配置 Projectile 组件和 CapsuleCollider(Is Trigger)。远程单位需在攻击动画松弦帧添加 OnAttackEffect Event,并在 UnitBase 中设置 attackType=RangedProjectile、projectilePrefab、projectileSpawnPoint。
+1 -1
View File
@@ -326,7 +326,7 @@ UnitBase
| **人类士兵**<br>*(坚韧重战/背水一战)* | **蓄力重斩**:挥舞短剑蓄力重劈,对前方单体敌人造成 **150% 物理伤害**(带短白剑气 `SwordSlashThickWhite`) | 重斩暴击率 +20%,基础伤害提升至 **190%** | **断岳重击**:重斩附带强力震慑,命中直接使目标**眩晕 1.2 秒**(挂 `StunStars` 星星),精准打断敌人蓄力! | **不屈战魂**:生命值首次跌破 35% 时进入无畏状态(脚底光环 `AuraSoftBlue`),**攻速 +60% 且普攻附带 30% 吸血**,持续 6 秒绝地翻盘! | | **人类士兵**<br>*(坚韧重战/背水一战)* | **蓄力重斩**:挥舞短剑蓄力重劈,对前方单体敌人造成 **150% 物理伤害**(带短白剑气 `SwordSlashThickWhite`) | 重斩暴击率 +20%,基础伤害提升至 **190%** | **断岳重击**:重斩附带强力震慑,命中直接使目标**眩晕 1.2 秒**(挂 `StunStars` 星星),精准打断敌人蓄力! | **不屈战魂**:生命值首次跌破 35% 时进入无畏状态(脚底光环 `AuraSoftBlue`),**攻速 +60% 且普攻附带 30% 吸血**,持续 6 秒绝地翻盘! |
| **弓箭手**<br>*(狙击点杀/后排压制)* | **迅捷三连**:搭弓连续高速射出 **3 支穿甲箭矢**,单体快速倾泻火力 | 箭矢飞行速度 +35%,三连射总伤害提升 **25%** | **追踪引信**:箭矢获得弧线微调追踪轨迹;且第 3 支箭命中时附带破甲标记,使目标**受到的所有伤害 +30%(持续 4s)** | **乱射风暴**:三连射升级为 **6 支风暴连射**;击杀目标后剩余箭矢自动散开弹射给周围其他敌人,兼顾单体点杀与残血收割! | | **弓箭手**<br>*(狙击点杀/后排压制)* | **迅捷三连**:搭弓连续高速射出 **3 支穿甲箭矢**,单体快速倾泻火力 | 箭矢飞行速度 +35%,三连射总伤害提升 **25%** | **追踪引信**:箭矢获得弧线微调追踪轨迹;且第 3 支箭命中时附带破甲标记,使目标**受到的所有伤害 +30%(持续 4s)** | **乱射风暴**:三连射升级为 **6 支风暴连射**;击杀目标后剩余箭矢自动散开弹射给周围其他敌人,兼顾单体点杀与残血收割! |
| **城堡法师**<br>*(轰炸火法/阵地火海)* | **爆裂火球**:吟唱发射一颗烈焰飞弹(`FireballSharpMissileFire`),命中造成 **160% 范围伤害**(`MagicExplosionFire`) | 火球爆破半径扩大 30%,爆破中心伤害提升至 **200%** | **焦土火海**:火球爆炸处在地面留下一片燃烧焦土,对踏入火海的敌人**每秒造成 30% 攻击力的持续引燃**(持续 4 秒) | **双重轰炸**:释放技能瞬间**连续轰出 2 颗烈焰巨球**!第二颗轰炸在更深处的后排敌群,双重火海前后封锁战场! | | **城堡法师**<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 第二章英雄技能阶梯解锁表 ### 11.2 第二章英雄技能阶梯解锁表