```
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}
|
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:
|
||||||
@@ -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.
@@ -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;
|
||||||
|
|||||||
@@ -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:
|
||||||
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-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
@@ -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 第二章英雄技能阶梯解锁表
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user