Kaynağa Gözat

上传一下现在的boss

HY-LSZNWIN10\Administrator 6 gün önce
ebeveyn
işleme
bbc95372e4
19 değiştirilmiş dosya ile 908 ekleme ve 196 silme
  1. 9 3
      ActionTowerDefense/Assets/Resources/Prefab/Arrow_shurikan_Boss.prefab
  2. 7 6
      ActionTowerDefense/Assets/Resources/Prefab/Boss/WaterSprite/Boss_Braid.prefab
  3. 5 5
      ActionTowerDefense/Assets/Resources/Prefab/Boss/WaterSprite/Boss_Umbrella.prefab
  4. 1 1
      ActionTowerDefense/Assets/Resources/Prefab/Boss/WaterSprite/hairController.prefab
  5. 2 2
      ActionTowerDefense/Assets/Resources/Prefab/Enemy/Enemy_Polliwog.prefab
  6. 11 4
      ActionTowerDefense/Assets/Resources/Prefab/Kunai.prefab
  7. 251 7
      ActionTowerDefense/Assets/Resources/Spine/Boss_braid/Boss_braid_SkeletonData_Controller.controller
  8. 52 0
      ActionTowerDefense/Assets/Resources/Spine/Boss_umbrella/Boss_braid_Boss_braid_2-Screen.mat
  9. 8 0
      ActionTowerDefense/Assets/Resources/Spine/Boss_umbrella/Boss_braid_Boss_braid_2-Screen.mat.meta
  10. 1 1
      ActionTowerDefense/Assets/Resources/Spine/Boss_umbrella/Boss_braid_SkeletonData.asset
  11. 8 0
      ActionTowerDefense/Assets/Resources/Spine/Boss_umbrella_red.meta
  12. 329 0
      ActionTowerDefense/Assets/Resources/Spine/Boss_umbrella_red/Boss_umbraller_SkeletonData_Controller.controller
  13. 8 0
      ActionTowerDefense/Assets/Resources/Spine/Boss_umbrella_red/Boss_umbraller_SkeletonData_Controller.controller.meta
  14. 1 1
      ActionTowerDefense/Assets/Resources/Spine/Enemy_Polliwog/Enemy_polliwog_SkeletonData_Controller.controller
  15. 4 0
      ActionTowerDefense/Assets/Scenes/Game.unity
  16. 197 158
      ActionTowerDefense/Assets/Scripts/Boss/WaterGhost/WaterSprite.cs
  17. 5 4
      ActionTowerDefense/Assets/Scripts/Boss/WaterGhost/WaterSpriteAttackController.cs
  18. 6 3
      ActionTowerDefense/Assets/Scripts/Boss/WaterGhost/WaterSpriteJumpMove.cs
  19. 3 1
      ActionTowerDefense/Assets/Scripts/Characters/Polliwog.cs

+ 9 - 3
ActionTowerDefense/Assets/Resources/Prefab/Arrow_shurikan_Boss.prefab

@@ -9792,7 +9792,6 @@ MonoBehaviour:
   m_Script: {fileID: 11500000, guid: 9a4a2dbc1e482cd4b9f1532e1fddcb30, type: 3}
   m_Name: 
   m_EditorClassIdentifier: 
-  stopTime: 1.5
   isBulletMove: 1
   owner: {fileID: 0}
   attackMethod:
@@ -9805,7 +9804,9 @@ MonoBehaviour:
       criticalChance: 0
       criticalStrikeEffect: 0
       lifesteal: 0
-      effect: {fileID: 0}
+      attackOnEffect: {fileID: 0}
+      attackOnEffectPos: {fileID: 0}
+      hitEffect: {fileID: 0}
       attackEffect: 
       attackMethod_Type: 0
       floatState:
@@ -9868,8 +9869,13 @@ MonoBehaviour:
   rb: {fileID: 0}
   trigedObjs: []
   bulletType: 1
+  stopTime: 1.5
+  backDuration: 0
+  stopDuration: 0
+  BoomerangWeaponController: {fileID: 0}
+  attackTrigger: {fileID: 0}
   isGetTarget: 0
-  speed: 20
+  speed: 30
   maxFlyTime: 2
   flyTime: 0
   trackTarget: {fileID: 0}

+ 7 - 6
ActionTowerDefense/Assets/Resources/Prefab/Boss/WaterSprite/Boss_Braid.prefab

@@ -429,7 +429,7 @@ MonoBehaviour:
   dropSoulMax: 8
   dropSoulMin: 5
   dropSoulAngle: 60
-  attackController: {fileID: 16214313399265844}
+  wsAttackController: {fileID: 16214313399265844}
   attackConfigurations:
   - category: 0
     attacks:
@@ -438,7 +438,7 @@ MonoBehaviour:
   - category: 1
     attacks:
     - attack: 1
-      weight: 4
+      weight: 3
     - attack: 3
       weight: 0
     - attack: 5
@@ -450,19 +450,19 @@ MonoBehaviour:
   - category: 3
     attacks:
     - attack: 1
-      weight: 1
+      weight: 2
     - attack: 3
       weight: 1
     - attack: 5
-      weight: 2
+      weight: 1
   - category: 4
     attacks:
     - attack: 1
-      weight: 1
+      weight: 3
     - attack: 3
       weight: 1
     - attack: 5
-      weight: 1
+      weight: 2
   curAttackType: 0
   smokeFx: {fileID: 417478504669294145, guid: db445634305994d48be096bffc1684d0, type: 3}
   isHoldingUmbre: 1
@@ -1095,6 +1095,7 @@ MonoBehaviour:
   m_Script: {fileID: 11500000, guid: 1d04dd6e35d71724689001e450625c39, type: 3}
   m_Name: 
   m_EditorClassIdentifier: 
+  character: {fileID: 0}
   curSpecialStates: -1
   attackMethod:
     attackName: 

+ 5 - 5
ActionTowerDefense/Assets/Resources/Prefab/Boss/WaterSprite/Boss_Umbrella.prefab

@@ -226,7 +226,7 @@ MonoBehaviour:
     attackType: 0
     attackInfo:
       attackValue: 0
-      damage: 50
+      damage: 30
       attackDir: {x: 0, y: 0, z: 0}
       criticalChance: 0
       criticalStrikeEffect: 0
@@ -10045,7 +10045,7 @@ Transform:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 5733499163905850023}
   m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
-  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalPosition: {x: 0, y: -8.5, z: 0}
   m_LocalScale: {x: 0.72, y: 0.72, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children: []
@@ -10080,7 +10080,7 @@ MeshRenderer:
   m_RenderingLayerMask: 1
   m_RendererPriority: 0
   m_Materials:
-  - {fileID: 2100000, guid: dd67d77b9f0890f458d81ae4d2dd79db, type: 2}
+  - {fileID: 2100000, guid: e186628db968afc4aa83876abc67856a, type: 2}
   m_StaticBatchInfo:
     firstSubMesh: 0
     subMeshCount: 0
@@ -10112,7 +10112,7 @@ Animator:
   m_GameObject: {fileID: 5733499163905850023}
   m_Enabled: 1
   m_Avatar: {fileID: 0}
-  m_Controller: {fileID: 9100000, guid: 79ef596c177486d4e9827ee8fd791396, type: 2}
+  m_Controller: {fileID: 9100000, guid: 772474ffd67a6224c91edb90f4af4b00, type: 2}
   m_CullingMode: 0
   m_UpdateMode: 0
   m_ApplyRootMotion: 0
@@ -10134,7 +10134,7 @@ MonoBehaviour:
   m_Script: {fileID: 11500000, guid: f9db98c60740638449864eb028fbe7ad, type: 3}
   m_Name: 
   m_EditorClassIdentifier: 
-  skeletonDataAsset: {fileID: 11400000, guid: abb0dc8d1bb4582478a2caefbb5d000e, type: 2}
+  skeletonDataAsset: {fileID: 11400000, guid: 6004cd0e29b91ab4db9bfc17d339607b, type: 2}
   initialSkinName: 
   fixPrefabOverrideViaMeshFilter: 2
   initialFlipX: 0

+ 1 - 1
ActionTowerDefense/Assets/Resources/Prefab/Boss/WaterSprite/hairController.prefab

@@ -46,7 +46,7 @@ MonoBehaviour:
   m_EditorClassIdentifier: 
   hairState: 0
   attackTime: 15
-  damage: 30
+  damage: 15
   hairPre: {fileID: 6508795287431129626, guid: 48ef6e9b8d784c64cb695d3b9b3a5f99, type: 3}
   warningPre: {fileID: 6508795287431129626, guid: e195fa890bd3aae43bd00260529e2372, type: 3}
   aims: []

+ 2 - 2
ActionTowerDefense/Assets/Resources/Prefab/Enemy/Enemy_Polliwog.prefab

@@ -880,7 +880,7 @@ MonoBehaviour:
     attackType: 0
     attackInfo:
       attackValue: 0
-      damage: 3
+      damage: 1
       attackDir: {x: 0, y: 0, z: 0}
       criticalChance: 0
       criticalStrikeEffect: 0
@@ -1061,7 +1061,7 @@ MonoBehaviour:
   targetCharacter: {fileID: 0}
   attackTarget: {fileID: 0}
   state: 0
-  totalHp: 120
+  totalHp: 60
   hp: 0
   regenerationTime: 0
   canFly: 1

+ 11 - 4
ActionTowerDefense/Assets/Resources/Prefab/Kunai.prefab

@@ -222,7 +222,7 @@ SpriteRenderer:
   m_Size: {x: 1.99, y: 0.42}
   m_AdaptiveModeThreshold: 0.5
   m_SpriteTileMode: 0
-  m_WasSpriteAssigned: 1
+  m_WasSpriteAssigned: 0
   m_MaskInteraction: 0
   m_SpriteSortPoint: 0
 --- !u!1 &3012442029607968663
@@ -285,7 +285,6 @@ MonoBehaviour:
   m_Script: {fileID: 11500000, guid: 9a4a2dbc1e482cd4b9f1532e1fddcb30, type: 3}
   m_Name: 
   m_EditorClassIdentifier: 
-  stopTime: 1.5
   isBulletMove: 1
   owner: {fileID: 0}
   attackMethod:
@@ -298,7 +297,9 @@ MonoBehaviour:
       criticalChance: 0
       criticalStrikeEffect: 0
       lifesteal: 0
-      effect: {fileID: 0}
+      attackOnEffect: {fileID: 0}
+      attackOnEffectPos: {fileID: 0}
+      hitEffect: {fileID: 0}
       attackEffect: 
       attackMethod_Type: 0
       floatState:
@@ -316,6 +317,7 @@ MonoBehaviour:
         time: 0
         haveLandingDamage: 0
         landingDamageRate: 0
+        jumpNum: 0
         ControlOrder: 0
       shotDown:
         directionType: 0
@@ -360,8 +362,13 @@ MonoBehaviour:
   rb: {fileID: 0}
   trigedObjs: []
   bulletType: 0
+  stopTime: 1.5
+  backDuration: 0
+  stopDuration: 0
+  BoomerangWeaponController: {fileID: 0}
+  attackTrigger: {fileID: 0}
   isGetTarget: 0
-  speed: 20
+  speed: 30
   maxFlyTime: 2
   flyTime: 0
   trackTarget: {fileID: 0}

+ 251 - 7
ActionTowerDefense/Assets/Resources/Spine/Boss_braid/Boss_braid_SkeletonData_Controller.controller

@@ -1731,6 +1731,125 @@ AnimationClip:
     floatParameter: 0
     intParameter: 0
     messageOptions: 1
+--- !u!1102 &-2257363547924065769
+AnimatorState:
+  serializedVersion: 6
+  m_ObjectHideFlags: 1
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: move_rise_no3
+  m_Speed: 1
+  m_CycleOffset: 0
+  m_Transitions: []
+  m_StateMachineBehaviours: []
+  m_Position: {x: 50, y: 50, z: 0}
+  m_IKOnFeet: 0
+  m_WriteDefaultValues: 1
+  m_Mirror: 0
+  m_SpeedParameterActive: 0
+  m_MirrorParameterActive: 0
+  m_CycleOffsetParameterActive: 0
+  m_TimeParameterActive: 0
+  m_Motion: {fileID: -4956703358938023529}
+  m_Tag: 
+  m_SpeedParameter: 
+  m_MirrorParameter: 
+  m_CycleOffsetParameter: 
+  m_TimeParameter: 
+--- !u!74 &-2008160416756989451
+AnimationClip:
+  m_ObjectHideFlags: 1
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: move_fall
+  serializedVersion: 7
+  m_Legacy: 0
+  m_Compressed: 0
+  m_UseHighQualityCurve: 1
+  m_RotationCurves: []
+  m_CompressedRotationCurves: []
+  m_EulerCurves: []
+  m_PositionCurves: []
+  m_ScaleCurves: []
+  m_FloatCurves:
+  - curve:
+      serializedVersion: 2
+      m_Curve:
+      - serializedVersion: 3
+        time: 0
+        value: 0
+        inSlope: 0
+        outSlope: 0
+        tangentMode: 0
+        weightedMode: 0
+        inWeight: 0
+        outWeight: 0
+      - serializedVersion: 3
+        time: 1
+        value: 0
+        inSlope: 0
+        outSlope: 0
+        tangentMode: 0
+        weightedMode: 0
+        inWeight: 0
+        outWeight: 0
+      m_PreInfinity: 2
+      m_PostInfinity: 2
+      m_RotationOrder: 4
+    attribute: dummy
+    path: 
+    classID: 1
+    script: {fileID: 0}
+  m_PPtrCurves: []
+  m_SampleRate: 30
+  m_WrapMode: 0
+  m_Bounds:
+    m_Center: {x: 0, y: 0, z: 0}
+    m_Extent: {x: 0, y: 0, z: 0}
+  m_ClipBindingConstant:
+    genericBindings:
+    - serializedVersion: 2
+      path: 0
+      attribute: 1341452863
+      script: {fileID: 0}
+      typeID: 1
+      customType: 0
+      isPPtrCurve: 0
+    pptrCurveMapping: []
+  m_AnimationClipSettings:
+    serializedVersion: 2
+    m_AdditiveReferencePoseClip: {fileID: 0}
+    m_AdditiveReferencePoseTime: 0
+    m_StartTime: 0
+    m_StopTime: 1
+    m_OrientationOffsetY: 0
+    m_Level: 0
+    m_CycleOffset: 0
+    m_HasAdditiveReferencePose: 0
+    m_LoopTime: 0
+    m_LoopBlend: 0
+    m_LoopBlendOrientation: 0
+    m_LoopBlendPositionY: 0
+    m_LoopBlendPositionXZ: 0
+    m_KeepOriginalOrientation: 0
+    m_KeepOriginalPositionY: 1
+    m_KeepOriginalPositionXZ: 0
+    m_HeightFromFeet: 0
+    m_Mirror: 0
+  m_EditorCurves: []
+  m_EulerEditorCurves: []
+  m_HasGenericRootTransform: 0
+  m_HasMotionFloatCurves: 0
+  m_Events:
+  - time: 1
+    functionName: hitwater
+    data: SpineEvent
+    objectReferenceParameter: {fileID: 0}
+    floatParameter: 0
+    intParameter: 0
+    messageOptions: 1
 --- !u!1102 &-1953351472425474637
 AnimatorState:
   serializedVersion: 6
@@ -1757,6 +1876,99 @@ AnimatorState:
   m_MirrorParameter: 
   m_CycleOffsetParameter: 
   m_TimeParameter: 
+--- !u!74 &-1895066200387918706
+AnimationClip:
+  m_ObjectHideFlags: 1
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: move_rise
+  serializedVersion: 7
+  m_Legacy: 0
+  m_Compressed: 0
+  m_UseHighQualityCurve: 1
+  m_RotationCurves: []
+  m_CompressedRotationCurves: []
+  m_EulerCurves: []
+  m_PositionCurves: []
+  m_ScaleCurves: []
+  m_FloatCurves:
+  - curve:
+      serializedVersion: 2
+      m_Curve:
+      - serializedVersion: 3
+        time: 0
+        value: 0
+        inSlope: 0
+        outSlope: 0
+        tangentMode: 0
+        weightedMode: 0
+        inWeight: 0
+        outWeight: 0
+      - serializedVersion: 3
+        time: 1
+        value: 0
+        inSlope: 0
+        outSlope: 0
+        tangentMode: 0
+        weightedMode: 0
+        inWeight: 0
+        outWeight: 0
+      m_PreInfinity: 2
+      m_PostInfinity: 2
+      m_RotationOrder: 4
+    attribute: dummy
+    path: 
+    classID: 1
+    script: {fileID: 0}
+  m_PPtrCurves: []
+  m_SampleRate: 30
+  m_WrapMode: 0
+  m_Bounds:
+    m_Center: {x: 0, y: 0, z: 0}
+    m_Extent: {x: 0, y: 0, z: 0}
+  m_ClipBindingConstant:
+    genericBindings:
+    - serializedVersion: 2
+      path: 0
+      attribute: 1341452863
+      script: {fileID: 0}
+      typeID: 1
+      customType: 0
+      isPPtrCurve: 0
+    pptrCurveMapping: []
+  m_AnimationClipSettings:
+    serializedVersion: 2
+    m_AdditiveReferencePoseClip: {fileID: 0}
+    m_AdditiveReferencePoseTime: 0
+    m_StartTime: 0
+    m_StopTime: 1
+    m_OrientationOffsetY: 0
+    m_Level: 0
+    m_CycleOffset: 0
+    m_HasAdditiveReferencePose: 0
+    m_LoopTime: 0
+    m_LoopBlend: 0
+    m_LoopBlendOrientation: 0
+    m_LoopBlendPositionY: 0
+    m_LoopBlendPositionXZ: 0
+    m_KeepOriginalOrientation: 0
+    m_KeepOriginalPositionY: 1
+    m_KeepOriginalPositionXZ: 0
+    m_HeightFromFeet: 0
+    m_Mirror: 0
+  m_EditorCurves: []
+  m_EulerEditorCurves: []
+  m_HasGenericRootTransform: 0
+  m_HasMotionFloatCurves: 0
+  m_Events:
+  - time: 0
+    functionName: hitwater
+    data: SpineEvent
+    objectReferenceParameter: {fileID: 0}
+    floatParameter: 0
+    intParameter: 0
+    messageOptions: 1
 --- !u!74 &-1760909097919521358
 AnimationClip:
   m_ObjectHideFlags: 0
@@ -2642,10 +2854,10 @@ AnimatorStateMachine:
     m_Position: {x: 550, y: 660, z: 0}
   - serializedVersion: 1
     m_State: {fileID: -6798333593589032740}
-    m_Position: {x: 790, y: 530, z: 0}
+    m_Position: {x: 730, y: 510, z: 0}
   - serializedVersion: 1
     m_State: {fileID: -8146034706639659219}
-    m_Position: {x: 830, y: 460, z: 0}
+    m_Position: {x: 740, y: 440, z: 0}
   - serializedVersion: 1
     m_State: {fileID: -3022758259381926777}
     m_Position: {x: 230, y: 580, z: 0}
@@ -2654,10 +2866,10 @@ AnimatorStateMachine:
     m_Position: {x: 140, y: 500, z: 0}
   - serializedVersion: 1
     m_State: {fileID: -4936188104067422683}
-    m_Position: {x: 487.6819, y: 606.5933, z: 0}
+    m_Position: {x: 960, y: 410, z: 0}
   - serializedVersion: 1
     m_State: {fileID: -2319556735364185202}
-    m_Position: {x: 720, y: 610, z: 0}
+    m_Position: {x: 960, y: 500, z: 0}
   - serializedVersion: 1
     m_State: {fileID: 5620932084232157930}
     m_Position: {x: 440, y: 330, z: 0}
@@ -2666,13 +2878,19 @@ AnimatorStateMachine:
     m_Position: {x: 960, y: 230, z: 0}
   - serializedVersion: 1
     m_State: {fileID: 7491584853838781276}
-    m_Position: {x: 960, y: 280, z: 0}
+    m_Position: {x: 960, y: 270, z: 0}
   - serializedVersion: 1
     m_State: {fileID: -28137171947083721}
-    m_Position: {x: 1104.2892, y: 393.93527, z: 0}
+    m_Position: {x: 960, y: 320, z: 0}
   - serializedVersion: 1
     m_State: {fileID: -7813120668644608406}
-    m_Position: {x: 1110, y: 480, z: 0}
+    m_Position: {x: 960, y: 360, z: 0}
+  - serializedVersion: 1
+    m_State: {fileID: -2257363547924065769}
+    m_Position: {x: 960, y: 450, z: 0}
+  - serializedVersion: 1
+    m_State: {fileID: 8331176851749146257}
+    m_Position: {x: 960, y: 540, z: 0}
   m_ChildStateMachines: []
   m_AnyStateTransitions: []
   m_EntryTransitions: []
@@ -3341,6 +3559,32 @@ AnimationClip:
     floatParameter: 0
     intParameter: 0
     messageOptions: 1
+--- !u!1102 &8331176851749146257
+AnimatorState:
+  serializedVersion: 6
+  m_ObjectHideFlags: 1
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: move_fall _no3
+  m_Speed: 1
+  m_CycleOffset: 0
+  m_Transitions: []
+  m_StateMachineBehaviours: []
+  m_Position: {x: 50, y: 50, z: 0}
+  m_IKOnFeet: 0
+  m_WriteDefaultValues: 1
+  m_Mirror: 0
+  m_SpeedParameterActive: 0
+  m_MirrorParameterActive: 0
+  m_CycleOffsetParameterActive: 0
+  m_TimeParameterActive: 0
+  m_Motion: {fileID: -3157817527596217372}
+  m_Tag: 
+  m_SpeedParameter: 
+  m_MirrorParameter: 
+  m_CycleOffsetParameter: 
+  m_TimeParameter: 
 --- !u!74 &9211576881899191406
 AnimationClip:
   m_ObjectHideFlags: 0

+ 52 - 0
ActionTowerDefense/Assets/Resources/Spine/Boss_umbrella/Boss_braid_Boss_braid_2-Screen.mat

@@ -0,0 +1,52 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!21 &2100000
+Material:
+  serializedVersion: 8
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: Boss_braid_Boss_braid_2-Screen
+  m_Shader: {fileID: 4800000, guid: 4e8caa36c07aacf4ab270da00784e4d9, type: 3}
+  m_ValidKeywords: []
+  m_InvalidKeywords:
+  - _USE8NEIGHBOURHOOD_ON
+  m_LightmapFlags: 4
+  m_EnableInstancingVariants: 0
+  m_DoubleSidedGI: 0
+  m_CustomRenderQueue: -1
+  stringTagMap: {}
+  disabledShaderPasses: []
+  m_SavedProperties:
+    serializedVersion: 3
+    m_TexEnvs:
+    - <noninit>:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _MainTex:
+        m_Texture: {fileID: 2800000, guid: 5a32c467be9a623428d59dec13be22ba, type: 3}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    m_Ints: []
+    m_Floats:
+    - <noninit>: 0
+    - _Cutoff: 0.1
+    - _Fill: 0
+    - _OutlineMipLevel: 0
+    - _OutlineOpaqueAlpha: 1
+    - _OutlineReferenceTexWidth: 1024
+    - _OutlineSmoothness: 1
+    - _OutlineWidth: 3
+    - _StencilComp: 8
+    - _StencilRef: 1
+    - _StraightAlphaInput: 0
+    - _ThresholdEnd: 0.25
+    - _Use8Neighbourhood: 1
+    - _UseScreenSpaceOutlineWidth: 0
+    m_Colors:
+    - <noninit>: {r: 0, g: 2.018574, b: 1e-45, a: 0.000007121922}
+    - _Color: {r: 1, g: 1, b: 1, a: 1}
+    - _OutlineColor: {r: 1, g: 1, b: 0, a: 1}
+  m_BuildTextureStacks: []

+ 8 - 0
ActionTowerDefense/Assets/Resources/Spine/Boss_umbrella/Boss_braid_Boss_braid_2-Screen.mat.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 41f34041010b38d4ab5c6abd21ae650c
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 2100000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 1 - 1
ActionTowerDefense/Assets/Resources/Spine/Boss_umbrella/Boss_braid_SkeletonData.asset

@@ -24,7 +24,7 @@ MonoBehaviour:
     multiplyMaterials: []
     screenMaterials:
     - pageName: Boss_braid_2.png
-      material: {fileID: 2100000, guid: d5957745dfd63644d85e47b7942a0da7, type: 2}
+      material: {fileID: 2100000, guid: 41f34041010b38d4ab5c6abd21ae650c, type: 2}
   skeletonDataModifiers: []
   fromAnimation: []
   toAnimation: []

+ 8 - 0
ActionTowerDefense/Assets/Resources/Spine/Boss_umbrella_red.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: e7af1c3509111d447ab9b1fae496bf1a
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 329 - 0
ActionTowerDefense/Assets/Resources/Spine/Boss_umbrella_red/Boss_umbraller_SkeletonData_Controller.controller

@@ -0,0 +1,329 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1107 &-7122085332421805702
+AnimatorStateMachine:
+  serializedVersion: 6
+  m_ObjectHideFlags: 1
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: Base Layer
+  m_ChildStates:
+  - serializedVersion: 1
+    m_State: {fileID: 9063192197865265463}
+    m_Position: {x: 200, y: 0, z: 0}
+  - serializedVersion: 1
+    m_State: {fileID: 6508088595563211672}
+    m_Position: {x: 235, y: 65, z: 0}
+  m_ChildStateMachines: []
+  m_AnyStateTransitions: []
+  m_EntryTransitions: []
+  m_StateMachineTransitions: {}
+  m_StateMachineBehaviours: []
+  m_AnyStatePosition: {x: 50, y: 20, z: 0}
+  m_EntryPosition: {x: 50, y: 120, z: 0}
+  m_ExitPosition: {x: 800, y: 120, z: 0}
+  m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
+  m_DefaultState: {fileID: 9063192197865265463}
+--- !u!74 &-3117138637065627286
+AnimationClip:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: idle
+  serializedVersion: 7
+  m_Legacy: 0
+  m_Compressed: 0
+  m_UseHighQualityCurve: 1
+  m_RotationCurves: []
+  m_CompressedRotationCurves: []
+  m_EulerCurves: []
+  m_PositionCurves: []
+  m_ScaleCurves: []
+  m_FloatCurves:
+  - curve:
+      serializedVersion: 2
+      m_Curve:
+      - serializedVersion: 3
+        time: 0
+        value: 0
+        inSlope: 0
+        outSlope: 0
+        tangentMode: 0
+        weightedMode: 0
+        inWeight: 0.33333334
+        outWeight: 0.33333334
+      - serializedVersion: 3
+        time: 1.3333334
+        value: 0
+        inSlope: 0
+        outSlope: 0
+        tangentMode: 0
+        weightedMode: 0
+        inWeight: 0.33333334
+        outWeight: 0.33333334
+      m_PreInfinity: 2
+      m_PostInfinity: 2
+      m_RotationOrder: 4
+    attribute: m_IsActive
+    path: 
+    classID: 1
+    script: {fileID: 0}
+  m_PPtrCurves: []
+  m_SampleRate: 60
+  m_WrapMode: 0
+  m_Bounds:
+    m_Center: {x: 0, y: 0, z: 0}
+    m_Extent: {x: 0, y: 0, z: 0}
+  m_ClipBindingConstant:
+    genericBindings:
+    - serializedVersion: 2
+      path: 0
+      attribute: 2086281974
+      script: {fileID: 0}
+      typeID: 1
+      customType: 0
+      isPPtrCurve: 0
+    pptrCurveMapping: []
+  m_AnimationClipSettings:
+    serializedVersion: 2
+    m_AdditiveReferencePoseClip: {fileID: 0}
+    m_AdditiveReferencePoseTime: 0
+    m_StartTime: 0
+    m_StopTime: 1.3333334
+    m_OrientationOffsetY: 0
+    m_Level: 0
+    m_CycleOffset: 0
+    m_HasAdditiveReferencePose: 0
+    m_LoopTime: 1
+    m_LoopBlend: 0
+    m_LoopBlendOrientation: 0
+    m_LoopBlendPositionY: 0
+    m_LoopBlendPositionXZ: 0
+    m_KeepOriginalOrientation: 0
+    m_KeepOriginalPositionY: 1
+    m_KeepOriginalPositionXZ: 0
+    m_HeightFromFeet: 0
+    m_Mirror: 0
+  m_EditorCurves:
+  - curve:
+      serializedVersion: 2
+      m_Curve:
+      - serializedVersion: 3
+        time: 0
+        value: 0
+        inSlope: 0
+        outSlope: 0
+        tangentMode: 0
+        weightedMode: 0
+        inWeight: 0.33333334
+        outWeight: 0.33333334
+      - serializedVersion: 3
+        time: 1.3333334
+        value: 0
+        inSlope: 0
+        outSlope: 0
+        tangentMode: 0
+        weightedMode: 0
+        inWeight: 0.33333334
+        outWeight: 0.33333334
+      m_PreInfinity: 2
+      m_PostInfinity: 2
+      m_RotationOrder: 4
+    attribute: m_IsActive
+    path: 
+    classID: 1
+    script: {fileID: 0}
+  m_EulerEditorCurves: []
+  m_HasGenericRootTransform: 0
+  m_HasMotionFloatCurves: 0
+  m_Events: []
+--- !u!91 &9100000
+AnimatorController:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: Boss_umbraller_SkeletonData_Controller
+  serializedVersion: 5
+  m_AnimatorParameters: []
+  m_AnimatorLayers:
+  - serializedVersion: 5
+    m_Name: Base Layer
+    m_StateMachine: {fileID: -7122085332421805702}
+    m_Mask: {fileID: 0}
+    m_Motions: []
+    m_Behaviours: []
+    m_BlendingMode: 0
+    m_SyncedLayerIndex: -1
+    m_DefaultWeight: 0
+    m_IKPass: 0
+    m_SyncedLayerAffectsTiming: 0
+    m_Controller: {fileID: 9100000}
+--- !u!74 &4369608762527255281
+AnimationClip:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: dive_end
+  serializedVersion: 7
+  m_Legacy: 0
+  m_Compressed: 0
+  m_UseHighQualityCurve: 1
+  m_RotationCurves: []
+  m_CompressedRotationCurves: []
+  m_EulerCurves: []
+  m_PositionCurves: []
+  m_ScaleCurves: []
+  m_FloatCurves:
+  - curve:
+      serializedVersion: 2
+      m_Curve:
+      - serializedVersion: 3
+        time: 0
+        value: 0
+        inSlope: 0
+        outSlope: 0
+        tangentMode: 0
+        weightedMode: 0
+        inWeight: 0.33333334
+        outWeight: 0.33333334
+      - serializedVersion: 3
+        time: 4
+        value: 0
+        inSlope: 0
+        outSlope: 0
+        tangentMode: 0
+        weightedMode: 0
+        inWeight: 0.33333334
+        outWeight: 0.33333334
+      m_PreInfinity: 2
+      m_PostInfinity: 2
+      m_RotationOrder: 4
+    attribute: m_IsActive
+    path: 
+    classID: 1
+    script: {fileID: 0}
+  m_PPtrCurves: []
+  m_SampleRate: 60
+  m_WrapMode: 0
+  m_Bounds:
+    m_Center: {x: 0, y: 0, z: 0}
+    m_Extent: {x: 0, y: 0, z: 0}
+  m_ClipBindingConstant:
+    genericBindings:
+    - serializedVersion: 2
+      path: 0
+      attribute: 2086281974
+      script: {fileID: 0}
+      typeID: 1
+      customType: 0
+      isPPtrCurve: 0
+    pptrCurveMapping: []
+  m_AnimationClipSettings:
+    serializedVersion: 2
+    m_AdditiveReferencePoseClip: {fileID: 0}
+    m_AdditiveReferencePoseTime: 0
+    m_StartTime: 0
+    m_StopTime: 4
+    m_OrientationOffsetY: 0
+    m_Level: 0
+    m_CycleOffset: 0
+    m_HasAdditiveReferencePose: 0
+    m_LoopTime: 0
+    m_LoopBlend: 0
+    m_LoopBlendOrientation: 0
+    m_LoopBlendPositionY: 0
+    m_LoopBlendPositionXZ: 0
+    m_KeepOriginalOrientation: 0
+    m_KeepOriginalPositionY: 1
+    m_KeepOriginalPositionXZ: 0
+    m_HeightFromFeet: 0
+    m_Mirror: 0
+  m_EditorCurves:
+  - curve:
+      serializedVersion: 2
+      m_Curve:
+      - serializedVersion: 3
+        time: 0
+        value: 0
+        inSlope: 0
+        outSlope: 0
+        tangentMode: 0
+        weightedMode: 0
+        inWeight: 0.33333334
+        outWeight: 0.33333334
+      - serializedVersion: 3
+        time: 4
+        value: 0
+        inSlope: 0
+        outSlope: 0
+        tangentMode: 0
+        weightedMode: 0
+        inWeight: 0.33333334
+        outWeight: 0.33333334
+      m_PreInfinity: 2
+      m_PostInfinity: 2
+      m_RotationOrder: 4
+    attribute: m_IsActive
+    path: 
+    classID: 1
+    script: {fileID: 0}
+  m_EulerEditorCurves: []
+  m_HasGenericRootTransform: 0
+  m_HasMotionFloatCurves: 0
+  m_Events: []
+--- !u!1102 &6508088595563211672
+AnimatorState:
+  serializedVersion: 6
+  m_ObjectHideFlags: 1
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: idle
+  m_Speed: 1
+  m_CycleOffset: 0
+  m_Transitions: []
+  m_StateMachineBehaviours: []
+  m_Position: {x: 50, y: 50, z: 0}
+  m_IKOnFeet: 0
+  m_WriteDefaultValues: 1
+  m_Mirror: 0
+  m_SpeedParameterActive: 0
+  m_MirrorParameterActive: 0
+  m_CycleOffsetParameterActive: 0
+  m_TimeParameterActive: 0
+  m_Motion: {fileID: -3117138637065627286}
+  m_Tag: 
+  m_SpeedParameter: 
+  m_MirrorParameter: 
+  m_CycleOffsetParameter: 
+  m_TimeParameter: 
+--- !u!1102 &9063192197865265463
+AnimatorState:
+  serializedVersion: 6
+  m_ObjectHideFlags: 1
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: dive_end
+  m_Speed: 1
+  m_CycleOffset: 0
+  m_Transitions: []
+  m_StateMachineBehaviours: []
+  m_Position: {x: 50, y: 50, z: 0}
+  m_IKOnFeet: 0
+  m_WriteDefaultValues: 1
+  m_Mirror: 0
+  m_SpeedParameterActive: 0
+  m_MirrorParameterActive: 0
+  m_CycleOffsetParameterActive: 0
+  m_TimeParameterActive: 0
+  m_Motion: {fileID: 4369608762527255281}
+  m_Tag: 
+  m_SpeedParameter: 
+  m_MirrorParameter: 
+  m_CycleOffsetParameter: 
+  m_TimeParameter: 

+ 8 - 0
ActionTowerDefense/Assets/Resources/Spine/Boss_umbrella_red/Boss_umbraller_SkeletonData_Controller.controller.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 772474ffd67a6224c91edb90f4af4b00
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 9100000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 1 - 1
ActionTowerDefense/Assets/Resources/Spine/Enemy_Polliwog/Enemy_polliwog_SkeletonData_Controller.controller

@@ -843,7 +843,7 @@ AnimatorStateMachine:
     m_Position: {x: 330, y: 350, z: 0}
   - serializedVersion: 1
     m_State: {fileID: 1784132200678309011}
-    m_Position: {x: 330, y: 160, z: 0}
+    m_Position: {x: 330, y: 170, z: 0}
   - serializedVersion: 1
     m_State: {fileID: 173646963901785902}
     m_Position: {x: 330, y: 200, z: 0}

+ 4 - 0
ActionTowerDefense/Assets/Scenes/Game.unity

@@ -25027,6 +25027,10 @@ PrefabInstance:
       propertyPath: m_Name
       value: Bg_water
       objectReference: {fileID: 0}
+    - target: {fileID: 973089827442774978, guid: 8e99578d43abbeb4d95b0ae7f30a436a, type: 3}
+      propertyPath: m_LocalPosition.x
+      value: 61.6
+      objectReference: {fileID: 0}
     - target: {fileID: 973089827831438300, guid: 8e99578d43abbeb4d95b0ae7f30a436a, type: 3}
       propertyPath: m_IsActive
       value: 0

+ 197 - 158
ActionTowerDefense/Assets/Scripts/Boss/WaterGhost/WaterSprite.cs

@@ -34,7 +34,7 @@ public class WaterSprite : Boss
         public AttackCategories category;
         public AttackAssignment[] attacks;
     }
-    [FoldoutGroup("组件")] public WaterSpriteAttackController attackController;
+    [FoldoutGroup("组件")] public WaterSpriteAttackController wsAttackController;
     [Space(30)]
     [Header("水诡白家娘娘")]
     [Header("攻击配置")]
@@ -76,6 +76,7 @@ public class WaterSprite : Boss
     private float angryTimer;
     private bool isAngry = false;
     public bool isTakingUmbre = false;
+    private Coroutine attackCoroutine;
 
     public override void Init()
     {
@@ -87,59 +88,6 @@ public class WaterSprite : Boss
         changeHPID++;
     }
 
-    public void ChangeStage(BossStage bs)
-    {
-        if (bs == curBossStage)
-        {
-            return;
-        }
-        curBossStage = bs;
-        switch (bs)
-        {
-            case BossStage.waterSprite:
-                if (changeHPID < changeStateHPPer.Length - 1)
-                {
-                    nextAimHP = (int)(changeStateHPPer[changeHPID] / 100f * totalHp);
-                    changeHPID++;
-                }
-                else
-                {
-                    nextAimHP = -1000;
-                }
-                bodyTrans.gameObject.SetActive(true);
-                //所有蝌蚪消失
-                pws.AllPoliDie();
-                break;
-            case BossStage.polliwog:
-                bodyTrans.gameObject.SetActive(false);
-                //在原地召唤一堆蝌蚪
-                pws.Shoot(polliNum, bodyTrans.position);
-
-                ChangeState(CharacterState.Idle);
-                break;
-            default:
-                break;
-        }
-        ClearAllSkills();
-        isTakingUmbre = false;
-        attackCount = 0;
-    }
-
-    private void OnStage()
-    {
-        switch (curBossStage)
-        {
-            case BossStage.polliwog:
-                pastPoliTime += Time.deltaTime;
-                if (pastPoliTime >= polliTime)
-                {
-                    ChangeStage(BossStage.waterSprite);
-                    pastPoliTime = 0;
-                }
-                break;
-        }
-    }
-
     public override void Update()
     {
         base.Update();
@@ -206,49 +154,6 @@ public class WaterSprite : Boss
         }
     }
 
-    public override void Attack()
-    {
-        attackCount--;
-        switch (curAttackType)
-        {
-            case AttackMethods.Move:
-                jumpMoveCS.CountJumpTime();
-                ChangeState(CharacterState.Run);
-                break;
-            case AttackMethods.Umbrella:
-                isHoldingUmbre = false;
-                ani.Play("shoot");
-                attack.SkillBlackUmbrella();
-                break;
-            case AttackMethods.Hair:
-                ani.Play("roar");
-                int attackTimes = 0;
-                switch (bossPhase)
-                {
-                    case 0:
-                        attackTimes = 6;
-                        break;
-                    case 1:
-                        attackTimes = 6;
-                        break;
-                    case 2:
-                        attackTimes = 10;
-                        break;
-                }
-                if (isAngry) attackTimes = 10;
-                attack.SkillHairSprint(attackTimes);
-                ChangeBossState(BossState.invincible);
-                break;
-            case AttackMethods.Shoot:
-                if (isHoldingUmbre) ani.Play("smoke", 0, 0);
-                else ani.Play("smoke_no3", 0, 0);
-                bodyFlickerTimer = Time.time + 10;
-                break;
-            default:
-                break;
-        }
-    }
-
     public override void ChangePhase()
     {
         base.ChangePhase();
@@ -261,6 +166,7 @@ public class WaterSprite : Boss
                 angryTimer = angryDuration;
                 RandomAttackState();
                 ClearAllSkills();
+                isTakingUmbre = false;
                 break;
             case 2:
                 ChangeCirculate(3);
@@ -277,6 +183,61 @@ public class WaterSprite : Boss
             isHoldingUmbre = true;
         }
     }
+    #region 状态相关
+    public override void ChangeState(CharacterState newState)
+    {
+        if (state == newState || newState == CharacterState.FramePause)
+        {
+            return;
+        }
+        Debug.Log("从" + state + "切换到" + newState);
+        switch (state)
+        {
+            case CharacterState.Run:
+                rb.velocity = Vector3.zero;
+                break;
+            case CharacterState.Attack:
+                spineEvent.isAttackOn = false;
+                break;
+            default:
+                break;
+        }
+        state = newState;
+        switch (newState)
+        {
+            case CharacterState.Idle:
+                if (bossState != BossState.weak)
+                {
+                    if (isHoldingUmbre)
+                    {
+                        int randomAni = RandomWithWeight(weight);
+                        ani.Play(idleAniNames[randomAni], 0, 0);
+                    }
+                    else
+                    {
+                        ani.Play("idle_no3", 0, 0);
+                    }
+                }
+                break;
+            case CharacterState.Run:
+                ToMove();
+                break;
+            case CharacterState.Die:
+                ani.Play("die", 0, 0);
+                gameObject.SetActive(false);
+                ClearAllSkills();
+                break;
+            case CharacterState.Attack:
+                if (!isToBossRoom)
+                {
+                    //hitResistance = 300;
+                    Attack();
+                }
+                break;
+            default:
+                break;
+        }
+    }
 
     public override void OnState()
     {
@@ -289,12 +250,12 @@ public class WaterSprite : Boss
                     if (Time.time - bodyFlickerTimer > bodyFlickerTime && isDisappear)
                     {
                         curInterval = 1;
-                        transform.position = attackController.blackUmbrella.transform.position - attackController.umbrellaBackPos.position + transform.position;
+                        transform.position = wsAttackController.blackUmbrella.transform.position - wsAttackController.umbrellaBackPos.position + transform.position;
                         EndCurAttackState(true);
                         BodyFlickerAppear();
                         ani.Play("shoot_end");
                         isTakingUmbre = false;
-                        attackController.blackUmbrella.BeTaken();
+                        wsAttackController.blackUmbrella.BeTaken();
                     }
                     else if (spineEvent.isAttackOn)
                     {
@@ -370,6 +331,107 @@ public class WaterSprite : Boss
             }
         }
     }
+    #endregion
+
+    #region 形态相关
+    public void ChangeStage(BossStage bs)
+    {
+        if (bs == curBossStage)
+        {
+            return;
+        }
+        curBossStage = bs;
+        switch (bs)
+        {
+            case BossStage.waterSprite:
+                if (changeHPID < changeStateHPPer.Length - 1)
+                {
+                    nextAimHP = (int)(changeStateHPPer[changeHPID] / 100f * totalHp);
+                    changeHPID++;
+                }
+                else
+                {
+                    nextAimHP = -1000;
+                }
+                bodyTrans.gameObject.SetActive(true);
+                //所有蝌蚪消失
+                pws.AllPoliDie();
+                break;
+            case BossStage.polliwog:
+                bodyTrans.gameObject.SetActive(false);
+                //在原地召唤一堆蝌蚪
+                pws.Shoot(polliNum, bodyTrans.position);
+
+                ChangeState(CharacterState.Idle);
+                break;
+            default:
+                break;
+        }
+        ClearAllSkills();
+        isTakingUmbre = false;
+        attackCount = 0;
+    }
+
+    private void OnStage()
+    {
+        switch (curBossStage)
+        {
+            case BossStage.polliwog:
+                pastPoliTime += Time.deltaTime;
+                if (pastPoliTime >= polliTime)
+                {
+                    ChangeStage(BossStage.waterSprite);
+                    pastPoliTime = 0;
+                }
+                break;
+        }
+    }
+    #endregion 
+
+    #region 攻击相关
+    public override void Attack()
+    {
+        attackCount--;
+        switch (curAttackType)
+        {
+            case AttackMethods.Move:
+                jumpMoveCS.CountJumpTime();
+                ChangeState(CharacterState.Run);
+                break;
+            case AttackMethods.Umbrella:
+                isHoldingUmbre = false;
+                ani.Play("shoot");
+                attack.SkillBlackUmbrella();
+                break;
+            case AttackMethods.Hair:
+                ani.Play("roar");
+                int attackTimes = 0;
+                switch (bossPhase)
+                {
+                    case 0:
+                        attackTimes = 6;
+                        break;
+                    case 1:
+                        attackTimes = 6;
+                        break;
+                    case 2:
+                        attackTimes = 10;
+                        break;
+                }
+                if (isAngry) attackTimes = 10;
+                attack.SkillHairSprint(attackTimes);
+                ChangeBossState(BossState.invincible);
+                break;
+            case AttackMethods.Shoot:
+                if (isHoldingUmbre) ani.Play("smoke", 0, 0);
+                else ani.Play("smoke_no3", 0, 0);
+                bodyFlickerTimer = Time.time + 2;
+                break;
+            default:
+                break;
+        }
+    }
+
 
     public override void OnAttack()
     {
@@ -399,20 +461,29 @@ public class WaterSprite : Boss
                     if (spineEvent.isAttackOn)
                     {
                         spineEvent.isAttackOn = false;
+                        int randomInt = Random.Range(0, 2);
                         int num = 0;
-                        switch (bossPhase)
+                        switch (randomInt)
                         {
-                            case 0:
-                                num = 7;
+                            case 0:                              
+                                switch (bossPhase)
+                                {
+                                    case 0:
+                                        num = 11;
+                                        break;
+                                    case 1:
+                                        num = 15;
+                                        break;
+                                    case 2:
+                                        num = 19;
+                                        break;
+                                }
+                                attack.KunaiAttack((pc.transform.position - pws.transform.position).normalized, num,8);
                                 break;
                             case 1:
-                                num = 11;
-                                break;
-                            case 2:
-                                num = 15;
+                                StartCoroutine(TestAttack(bossPhase));
                                 break;
-                        }
-                        attack.KunaiAttack((pc.transform.position - pws.transform.position).normalized, num);
+                        }  
                         EndCurAttackState(true);
                         ChangeState(CharacterState.Run);
                     }
@@ -429,62 +500,30 @@ public class WaterSprite : Boss
             default:
                 break;
         }
-    }
 
-    public override void ChangeState(CharacterState newState)
-    {
-        if (state == newState || newState == CharacterState.FramePause)
-        {
-            return;
-        }
-        Debug.Log("从" + state + "切换到" + newState);
-        switch (state)
+        IEnumerator TestAttack(int bossPhase)
         {
-            case CharacterState.Run:
-                rb.velocity = Vector3.zero;
-                break;
-            case CharacterState.Attack:
-                spineEvent.isAttackOn = false;
-                break;
-            default:
-                break;
-        }
-        state = newState;
-        switch (newState)
-        {
-            case CharacterState.Idle:
-                if (bossState != BossState.weak)
-                {
-                    if (isHoldingUmbre)
-                    {
-                        int randomAni = RandomWithWeight(weight);
-                        ani.Play(idleAniNames[randomAni], 0, 0);
-                    }
-                    else
-                    {
-                        ani.Play("idle_no3", 0, 0);
-                    }
-                }
-                break;
-            case CharacterState.Run:
-                ToMove();
-                break;
-            case CharacterState.Die:
-                ani.Play("die", 0, 0);
-                gameObject.SetActive(false);
-                ClearAllSkills();
-                break;
-            case CharacterState.Attack:
-                if (!isToBossRoom)
+            float shortInterval = 0.08f;
+            for(int i = 0;i < 3; i++)
+            {
+                for (int j = 0; j < bossPhase+2; j++)
                 {
-                    //hitResistance = 300;
-                    Attack();
+                    attack.KunaiAttack((pc.transform.position - pws.transform.position).normalized, 1);
+                    yield return new WaitForSeconds(shortInterval);
                 }
-                break;
-            default:
-                break;
+                yield return new WaitForSeconds(0.2f);
+            }
+            yield return new WaitForSeconds(0.2f);
+
+            for (int i = 0; i < 7 + bossPhase * 2; i++)
+            {
+                attack.KunaiAttack((pc.transform.position - pws.transform.position).normalized, 1);
+                yield return new WaitForSeconds(shortInterval);
+            }
+            yield return new WaitForSeconds(0.2f);
         }
     }
+    #endregion
 
     #region 瞬身相关
     public void BodyFlickerDisappear()

+ 5 - 4
ActionTowerDefense/Assets/Scripts/Boss/WaterGhost/WaterSpriteAttackController.cs

@@ -83,7 +83,7 @@ public class WaterSpriteAttackController : AttackController
             ws.BodyFlickerAppear();
             ws.ani.Play("shoot_end");
             ws.isTakingUmbre = false;
-            ws.attackController.blackUmbrella.BeTaken();
+            ws.wsAttackController.blackUmbrella.BeTaken();
         }
         else
         {
@@ -131,7 +131,7 @@ public class WaterSpriteAttackController : AttackController
     }
 
     //苦无远程攻击
-    public void KunaiAttack(Vector3 dir, int num)
+    public void KunaiAttack(Vector3 dir, int num,float interval = 10f)
     {
         if (num <= 0) return; // 避免无效数量
         ws.ani.Play("roar");
@@ -143,7 +143,7 @@ public class WaterSpriteAttackController : AttackController
         for (int i = 0; i < num; i++)
         {
             // 每个苦无的角度偏移(从起始角度开始,每次增加10度)
-            float angle = startAngle + i * 10f;
+            float angle = startAngle + i * interval;
             // 计算最终方向(绕Z轴旋转对应角度)
             Vector3 bulletDir = Quaternion.Euler(0, 0, angle) * dir;
 
@@ -151,7 +151,8 @@ public class WaterSpriteAttackController : AttackController
             GameObject obj = PoolManager.Instantiate(kunaiPrefab, ws.pws.transform.position, Quaternion.identity, null);
             Bullet bullet = obj.GetComponent<Bullet>();
             bullet.BeShoot(ws, ws.pws.transform.position, bulletDir);
-            bullet.attackMethod.attackInfo.damage = 50;
+            bullet.attackMethod.attackInfo.damage = 20;
+            //bullet.speed = 30;
         }
     }
 

+ 6 - 3
ActionTowerDefense/Assets/Scripts/Boss/WaterGhost/WaterSpriteJumpMove.cs

@@ -135,11 +135,13 @@ public class WaterSpriteJumpMove : MonoBehaviour
                 }
                 else
                 {
-                    ws.ani.Play("move_rise", 0, 0);
+                    if(ws.isHoldingUmbre) ws.ani.Play("move_rise", 0, 0);
+                    else ws.ani.Play("move_rise_no3", 0, 0);
                 }
                 break;
             case JumpMoveState.fall:
-                ws.ani.Play("move_fall", 0, 0);
+                if (ws.isHoldingUmbre) ws.ani.Play("move_fall", 0, 0);
+                else ws.ani.Play("move_fall_no3", 0, 0);
                 jumpTime = 0;
                 break;
             case JumpMoveState.none:
@@ -150,7 +152,8 @@ public class WaterSpriteJumpMove : MonoBehaviour
                 idleY = Random.Range(minIdleY, maxIdleY);
                 float useTime = (idleY - OnWaterPosY) / upSpeed;
                 ws.ani.speed = singleJumpTime / useTime;
-                ws.ani.Play("move_rise", 0, 0);
+                if (ws.isHoldingUmbre) ws.ani.Play("move_rise", 0, 0);
+                else ws.ani.Play("move_rise_no3", 0, 0);
                 break;
             default:
                 break;

+ 3 - 1
ActionTowerDefense/Assets/Scripts/Characters/Polliwog.cs

@@ -98,6 +98,8 @@ public class Polliwog : Enemy
                 attributeStatus.character.mecanim.transform.localPosition = Vector3.zero;
                 attributeStatus.character.mecanim.transform.localRotation = Quaternion.Euler(0, 0, 0);
                 attributeStatus.character.transform.rotation = Quaternion.Euler(transform.rotation.eulerAngles.x, transform.rotation.eulerAngles.y, attributeStatus.character.platformRotZ);
+                nowCanFly = true;
+                ani.speed = 1;
                 break;
         }
         state = newState;
@@ -108,7 +110,7 @@ public class Polliwog : Enemy
                 currentVelocity = Vector3.zero;
                 break;
             case CharacterState.Run:
-                ani.Play("walk", 0, 0);
+                ani.Play("idle", 0, 0);
                 break;
             case CharacterState.Die:
                 ani.Play("die", 0, 0);