From d35d31d85fd4b827dc37008aef39c019b6a7781d Mon Sep 17 00:00:00 2001
From: chenxin <chenxin6991@163.com>
Date: Sat, 07 Nov 2020 16:34:50 +0800
Subject: [PATCH] Merge commit '2940e451058b1af7541ff651f485f33a10e92f7e' into master

---
 Assets/Scripts/TowerDefense/UI/EndlessBossSkillAI/EndlessBossSkillAI.cs    |    2 
 Assets/Scripts/TowerDefense/UI/EndlessBossSkill/EndlessBossSkill.cs        |   43 ++
 Assets/Scripts/TowerDefense/Agents/Agent.cs                                |    2 
 Assets/Scripts/Data/EndlessPortData.cs                                     |   24 +
 Assets/Scripts/TowerDefense/Agents/WoodPileAgent.cs.meta                   |   11 
 Assets/Resources/Prefabs/Endless/WoodPile.prefab                           |  496 +++++++++++++++++++++++++++++++
 Assets/Scripts/TowerDefense/UI/EndlessBossSkill/EndlessBossSkillManager.cs |   25 +
 Assets/Scenes/Levels/Battle/Endless.unity                                  |    1 
 Assets/Scripts/TowerDefense/Agents/BubbleBombAgent.cs                      |   15 
 Assets/Scripts/TowerDefense/UI/EndlessBossSkillAI/NormalBossSkillAI.cs     |   11 
 Assets/Scripts/TowerDefense/Towers/Projectiles/BallisticAttack.cs          |   23 +
 Assets/Scripts/Core/Health/DamageableBehaviour.cs                          |    2 
 Assets/Scripts/Event/EventType.cs                                          |    2 
 Assets/Resources/Prefabs/Endless/BubbleBomb.prefab                         |    3 
 Assets/Scripts/ActionGameFramework/Health/DamageCollider.cs                |    4 
 Assets/Scripts/Enum/SpawnAgentType.cs                                      |    2 
 Assets/Scripts/TowerDefense/UI/EndlessBossSkill/BossSkillBubbleBomb.cs     |   46 --
 Assets/Scripts/TowerDefense/Agents/WoodPileAgent.cs                        |  114 +++++++
 Assets/Resources/Prefabs/Endless/WoodPile.prefab.meta                      |    7 
 Assets/Scripts/TowerDefense/UI/EndlessBossSkill/BossSkillWoodPile.cs       |   89 +++++
 20 files changed, 856 insertions(+), 66 deletions(-)

diff --git a/Assets/Resources/Prefabs/Endless/BubbleBomb.prefab b/Assets/Resources/Prefabs/Endless/BubbleBomb.prefab
index 5524e4e..30e0905 100644
--- a/Assets/Resources/Prefabs/Endless/BubbleBomb.prefab
+++ b/Assets/Resources/Prefabs/Endless/BubbleBomb.prefab
@@ -219,7 +219,6 @@
   bShowDebugNode: 0
   NormalEffect: {fileID: 5386092016719681635}
   ExplodeEffect: {fileID: 1333670259778310432}
-  Collider: {fileID: 6659287669452185599}
 --- !u!54 &8434816861478773555
 Rigidbody:
   m_ObjectHideFlags: 0
@@ -249,7 +248,7 @@
   m_Radius: 2.2
   m_Height: 1
   m_Direction: 1
-  m_Center: {x: 0, y: 0.4, z: 0}
+  m_Center: {x: 0, y: 0.4, z: -1.94}
 --- !u!114 &8434816861478773554
 MonoBehaviour:
   m_ObjectHideFlags: 0
diff --git a/Assets/Resources/Prefabs/Endless/WoodPile.prefab b/Assets/Resources/Prefabs/Endless/WoodPile.prefab
new file mode 100644
index 0000000..4085018
--- /dev/null
+++ b/Assets/Resources/Prefabs/Endless/WoodPile.prefab
@@ -0,0 +1,496 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &138455136374950083
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 8534711676145704198}
+  - component: {fileID: 3143404536626948965}
+  - component: {fileID: 8832774425949147379}
+  m_Layer: 0
+  m_Name: Cube
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &8534711676145704198
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 138455136374950083}
+  m_LocalRotation: {x: -0, y: 1, z: -0, w: 0}
+  m_LocalPosition: {x: 0, y: 0.053, z: 0}
+  m_LocalScale: {x: 1.5999999, y: 1.5999999, z: 1.6}
+  m_Children: []
+  m_Father: {fileID: 8434816861478773449}
+  m_RootOrder: 3
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &3143404536626948965
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 138455136374950083}
+  m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!23 &8832774425949147379
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 138455136374950083}
+  m_Enabled: 1
+  m_CastShadows: 1
+  m_ReceiveShadows: 1
+  m_DynamicOccludee: 1
+  m_MotionVectors: 1
+  m_LightProbeUsage: 1
+  m_ReflectionProbeUsage: 1
+  m_RayTracingMode: 2
+  m_RayTraceProcedural: 0
+  m_RenderingLayerMask: 1
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 2100000, guid: 94110c9a997a3cf4d971aa75155f5351, type: 2}
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
+  m_StaticBatchRoot: {fileID: 0}
+  m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
+  m_ScaleInLightmap: 1
+  m_ReceiveGI: 1
+  m_PreserveUVs: 0
+  m_IgnoreNormalsForChartDetection: 0
+  m_ImportantGI: 0
+  m_StitchLightmapSeams: 1
+  m_SelectedEditorRenderState: 3
+  m_MinimumChartSize: 4
+  m_AutoUVMaxDistance: 0.5
+  m_AutoUVMaxAngle: 89
+  m_LightmapParameters: {fileID: 0}
+  m_SortingLayerID: 0
+  m_SortingLayer: 0
+  m_SortingOrder: 0
+  m_AdditionalVertexStreams: {fileID: 0}
+--- !u!1 &8434816860007424699
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 8434816860007424696}
+  m_Layer: 11
+  m_Name: Targetable
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &8434816860007424696
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8434816860007424699}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0.5, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 8434816861478773449}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &8434816861478773448
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 8434816861478773449}
+  - component: {fileID: 8434816861478773452}
+  - component: {fileID: 8434816861478773455}
+  - component: {fileID: 8434816861478773555}
+  - component: {fileID: 7051272566736607782}
+  - component: {fileID: 8434816861478773554}
+  - component: {fileID: 2476106126470318335}
+  - component: {fileID: 652547545057790155}
+  - component: {fileID: 2034107896435957072}
+  - component: {fileID: 7091940065452968968}
+  - component: {fileID: 1083071696881444773}
+  m_Layer: 11
+  m_Name: WoodPile
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &8434816861478773449
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8434816861478773448}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0.2, z: 0}
+  m_LocalScale: {x: 4.5, y: 4.5, z: 4.5}
+  m_Children:
+  - {fileID: 8434816860007424696}
+  - {fileID: 1277171420674534872}
+  - {fileID: 9114815543095638400}
+  - {fileID: 8534711676145704198}
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!195 &8434816861478773452
+NavMeshAgent:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8434816861478773448}
+  m_Enabled: 1
+  m_AgentTypeID: 0
+  m_Radius: 0.1
+  m_Speed: 2
+  m_Acceleration: 20
+  avoidancePriority: 50
+  m_AngularSpeed: 0
+  m_StoppingDistance: 0.4
+  m_AutoTraverseOffMeshLink: 1
+  m_AutoBraking: 1
+  m_AutoRepath: 1
+  m_Height: 1
+  m_BaseOffset: 0
+  m_WalkableMask: 7
+  m_ObstacleAvoidanceType: 0
+--- !u!114 &8434816861478773455
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8434816861478773448}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 4a4f7293b07e4698a4e3b652679f0c75, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  description: 
+  projectile: {fileID: 0}
+  projectilePoints: []
+  epicenter: {fileID: 8434816861478773449}
+  isMultiAttack: 0
+  maxAttackNum: 1
+  fireRate: 0
+  bWoodAffector: 0
+  randomAudioSource: {fileID: 0}
+  towerTargetter: {fileID: 7490226013430720439}
+  radiusEffectColor: {r: 0, g: 0, b: 0, a: 0}
+--- !u!54 &8434816861478773555
+Rigidbody:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8434816861478773448}
+  serializedVersion: 2
+  m_Mass: 1
+  m_Drag: 0
+  m_AngularDrag: 0.05
+  m_UseGravity: 0
+  m_IsKinematic: 1
+  m_Interpolate: 0
+  m_Constraints: 0
+  m_CollisionDetection: 0
+--- !u!114 &7051272566736607782
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8434816861478773448}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 4eb6b59d40564378ba0b1580a4a9dd85, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  lootDropped: 10
+--- !u!114 &8434816861478773554
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8434816861478773448}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 8cf1cc7cb7e6b49f893f609dd57fce01, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  damageableBehaviour: {fileID: 0}
+  damageScale: 1
+--- !u!114 &2476106126470318335
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8434816861478773448}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 7d012ff014d994436a27059a09e8ab64, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  homeBaseAttackChargeTime: 1
+--- !u!114 &652547545057790155
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8434816861478773448}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 59d007c1fe5e41c1888e4af3392f8676, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  initialPoolCapacity: 10
+--- !u!114 &2034107896435957072
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8434816861478773448}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fedeb0b3c5e104ea19d0d4599d22ab97, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  damage: 10
+  damageMulti: 1
+  towerName: 
+  bSet: 0
+  chanceToSpawnCollisionPrefab: 1
+  collisionObj: {fileID: 0}
+  alignment:
+    unityObjectReference: {fileID: 11400000, guid: 9dc4735bf52f547d59ebe1007e9a0e7f,
+      type: 2}
+--- !u!114 &7091940065452968968
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8434816861478773448}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 74cdda61650491a4fb62ef5cac504f6e, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  configuration:
+    maxHealth: 60
+    startingHealth: 60
+    alignment:
+      unityObjectReference: {fileID: 11400000, guid: 9dc4735bf52f547d59ebe1007e9a0e7f,
+        type: 2}
+  targetTransform: {fileID: 0}
+  bElit: 0
+  bBoss: 0
+  poisonTex: {fileID: 0}
+  frozenTex: {fileID: 0}
+  commonTex: {fileID: 0}
+  PoisonParticle: {fileID: 0}
+  PoisonEndParticle: {fileID: 0}
+  SlowDownParticle: {fileID: 0}
+  FrostParticle: {fileID: 0}
+  appliedEffectOffset: {x: 0, y: 0, z: 0}
+  appliedEffectScale: 1
+  healthBar: {fileID: 9222104150701355608}
+  spawnParticle: {fileID: 0}
+  bShowDebugNode: 0
+--- !u!65 &1083071696881444773
+BoxCollider:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8434816861478773448}
+  m_Material: {fileID: 0}
+  m_IsTrigger: 0
+  m_Enabled: 1
+  serializedVersion: 2
+  m_Size: {x: 1.8, y: 1.8, z: 0.61}
+  m_Center: {x: 0, y: 0, z: -1.15}
+--- !u!1 &8585545065585961043
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1277171420674534872}
+  - component: {fileID: 7490226013430720439}
+  - component: {fileID: 833589883818491094}
+  m_Layer: 0
+  m_Name: Targetter
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &1277171420674534872
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8585545065585961043}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 8434816861478773449}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &7490226013430720439
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8585545065585961043}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: d0e4035901ee40bba7c0866d2c6338a1, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  turret: {fileID: 0}
+  searchEnemyFunc: 1
+  turretXRotationRange: {x: 0, y: 359}
+  onlyYTurretRotation: 1
+  searchRate: 0
+  idleRotationSpeed: 1
+  idleCorrectionTime: 0.2
+  attachedCollider: {fileID: 833589883818491094}
+  idleWaitTime: 2
+--- !u!135 &833589883818491094
+SphereCollider:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8585545065585961043}
+  m_Material: {fileID: 0}
+  m_IsTrigger: 1
+  m_Enabled: 1
+  serializedVersion: 2
+  m_Radius: 0
+  m_Center: {x: 0, y: 0, z: 0}
+--- !u!1001 &4198952192164864370
+PrefabInstance:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_Modification:
+    m_TransformParent: {fileID: 8434816861478773449}
+    m_Modifications:
+    - target: {fileID: 4912913822749028214, guid: 3d8c8419dca866149b46e4ab68d15496,
+        type: 3}
+      propertyPath: m_Name
+      value: HealthBar
+      objectReference: {fileID: 0}
+    - target: {fileID: 4916796871218370802, guid: 3d8c8419dca866149b46e4ab68d15496,
+        type: 3}
+      propertyPath: m_LocalPosition.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4916796871218370802, guid: 3d8c8419dca866149b46e4ab68d15496,
+        type: 3}
+      propertyPath: m_LocalPosition.y
+      value: 1.5
+      objectReference: {fileID: 0}
+    - target: {fileID: 4916796871218370802, guid: 3d8c8419dca866149b46e4ab68d15496,
+        type: 3}
+      propertyPath: m_LocalPosition.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4916796871218370802, guid: 3d8c8419dca866149b46e4ab68d15496,
+        type: 3}
+      propertyPath: m_LocalRotation.x
+      value: 0.7071068
+      objectReference: {fileID: 0}
+    - target: {fileID: 4916796871218370802, guid: 3d8c8419dca866149b46e4ab68d15496,
+        type: 3}
+      propertyPath: m_LocalRotation.y
+      value: -0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4916796871218370802, guid: 3d8c8419dca866149b46e4ab68d15496,
+        type: 3}
+      propertyPath: m_LocalRotation.z
+      value: -0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4916796871218370802, guid: 3d8c8419dca866149b46e4ab68d15496,
+        type: 3}
+      propertyPath: m_LocalRotation.w
+      value: 0.7071068
+      objectReference: {fileID: 0}
+    - target: {fileID: 4916796871218370802, guid: 3d8c8419dca866149b46e4ab68d15496,
+        type: 3}
+      propertyPath: m_RootOrder
+      value: 2
+      objectReference: {fileID: 0}
+    - target: {fileID: 4916796871218370802, guid: 3d8c8419dca866149b46e4ab68d15496,
+        type: 3}
+      propertyPath: m_LocalEulerAnglesHint.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4916796871218370802, guid: 3d8c8419dca866149b46e4ab68d15496,
+        type: 3}
+      propertyPath: m_LocalEulerAnglesHint.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4916796871218370802, guid: 3d8c8419dca866149b46e4ab68d15496,
+        type: 3}
+      propertyPath: m_LocalEulerAnglesHint.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 5025685238251000618, guid: 3d8c8419dca866149b46e4ab68d15496,
+        type: 3}
+      propertyPath: damageableBehaviour
+      value: 
+      objectReference: {fileID: 7091940065452968968}
+    m_RemovedComponents: []
+  m_SourcePrefab: {fileID: 100100000, guid: 3d8c8419dca866149b46e4ab68d15496, type: 3}
+--- !u!4 &9114815543095638400 stripped
+Transform:
+  m_CorrespondingSourceObject: {fileID: 4916796871218370802, guid: 3d8c8419dca866149b46e4ab68d15496,
+    type: 3}
+  m_PrefabInstance: {fileID: 4198952192164864370}
+  m_PrefabAsset: {fileID: 0}
+--- !u!114 &9222104150701355608 stripped
+MonoBehaviour:
+  m_CorrespondingSourceObject: {fileID: 5025685238251000618, guid: 3d8c8419dca866149b46e4ab68d15496,
+    type: 3}
+  m_PrefabInstance: {fileID: 4198952192164864370}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 5440fde571ec4db4a719f37df8e972f0, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
diff --git a/Assets/Resources/Prefabs/Endless/WoodPile.prefab.meta b/Assets/Resources/Prefabs/Endless/WoodPile.prefab.meta
new file mode 100644
index 0000000..3fb36de
--- /dev/null
+++ b/Assets/Resources/Prefabs/Endless/WoodPile.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: debfb40db53346747839fbb2bba8eaf5
+PrefabImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scenes/Levels/Battle/Endless.unity b/Assets/Scenes/Levels/Battle/Endless.unity
index 7f124fe..1efb516 100644
--- a/Assets/Scenes/Levels/Battle/Endless.unity
+++ b/Assets/Scenes/Levels/Battle/Endless.unity
@@ -17463,6 +17463,7 @@
   - {fileID: 2600682549799167283, guid: 49b7c959ca8c2a04fb624bfcc4ae6d70, type: 3}
   - {fileID: 8299866977034198745, guid: 27794bd3f4607d24eb654bc09cab1b4d, type: 3}
   - {fileID: 6638534413219671158, guid: 080168af0fb1a0f48bd653b0def3737e, type: 3}
+  - {fileID: 652547545057790155, guid: debfb40db53346747839fbb2bba8eaf5, type: 3}
 --- !u!4 &1991275771
 Transform:
   m_ObjectHideFlags: 0
diff --git a/Assets/Scripts/ActionGameFramework/Health/DamageCollider.cs b/Assets/Scripts/ActionGameFramework/Health/DamageCollider.cs
index 139ca35..87cf356 100644
--- a/Assets/Scripts/ActionGameFramework/Health/DamageCollider.cs
+++ b/Assets/Scripts/ActionGameFramework/Health/DamageCollider.cs
@@ -54,7 +54,7 @@
             var agent = this.gameObject.GetComponent<Agent>();
             if (agent == null)
                 return;
-            
+
             BallisticProjectile ballistic = c.gameObject.GetComponent<BallisticProjectile>();
 
             if (ballistic.IsHitEnemy)
@@ -68,7 +68,7 @@
             LazyLoad();
 
             BallisticAttack ballisticAttack = damager.GetComponent<BallisticAttack>();
-            ballisticAttack.DealDamage((Targetable)damageableBehaviour);
+            ballisticAttack.DealDamage((Targetable)damageableBehaviour, ballisticAttack.attributeId);
 
             damager.HasDamaged(c.transform.position, damageableBehaviour.configuration.alignmentProvider);
         }
diff --git a/Assets/Scripts/Core/Health/DamageableBehaviour.cs b/Assets/Scripts/Core/Health/DamageableBehaviour.cs
index f7b32ef..9f754ef 100644
--- a/Assets/Scripts/Core/Health/DamageableBehaviour.cs
+++ b/Assets/Scripts/Core/Health/DamageableBehaviour.cs
@@ -114,7 +114,7 @@
         /// <summary>
         /// Fires the removed event
         /// </summary>
-        void OnRemoved()
+        protected void OnRemoved()
         {
             if (removed != null)
             {
diff --git a/Assets/Scripts/Data/EndlessPortData.cs b/Assets/Scripts/Data/EndlessPortData.cs
index 1a2f8a3..6a8c4cf 100644
--- a/Assets/Scripts/Data/EndlessPortData.cs
+++ b/Assets/Scripts/Data/EndlessPortData.cs
@@ -177,6 +177,30 @@
         }
 
         /// <summary>
+        /// 根据关卡等级和波次获得该波次敌人的血量
+        /// </summary>
+        /// <param name="level"></param>
+        /// <param name="wave"></param>
+        /// <param name="tunel">赛道</param>
+        public static float GetWaveEnemiesHP(int level, int wave, int tunel)
+        {
+            List<List<EndlessPortConfig>> list = GetLevelWaveData(level);
+            List<EndlessPortConfig> waveData = list[wave];
+            float hp = 0;
+
+            for (int i = 0; i < waveData.Count; ++i)
+            {
+                if (waveData[i].Config.tunel == tunel)
+                {
+                    hp = waveData[i].Config.b_hp;
+                    break;
+                }
+            }
+
+            return hp;
+        }
+
+        /// <summary>
         /// 根据关卡等级、波次、赛道获得击杀敌人掉落的奖励列表
         /// </summary>
         /// <param name="level">关卡等级</param>
diff --git a/Assets/Scripts/Enum/SpawnAgentType.cs b/Assets/Scripts/Enum/SpawnAgentType.cs
index 45a54e8..468bcdb 100644
--- a/Assets/Scripts/Enum/SpawnAgentType.cs
+++ b/Assets/Scripts/Enum/SpawnAgentType.cs
@@ -13,7 +13,7 @@
         // 泡泡炸弹,在PVE模式里面,boss技能可以召唤炸弹和木桩等
         BubbleBomb,
 
-        // 召唤木桩
+        // 木桩墙壁
         WoodPile
     }
 }
\ No newline at end of file
diff --git a/Assets/Scripts/Event/EventType.cs b/Assets/Scripts/Event/EventType.cs
index af1b8af..c6ce753 100644
--- a/Assets/Scripts/Event/EventType.cs
+++ b/Assets/Scripts/Event/EventType.cs
@@ -65,6 +65,8 @@
         EndlessLoseHeart,
         // 爱心为0
         EndlessHeartAllLose,
+        // 木桩墙壁被打死
+        EndlessWoodPileBeKilled,
     }
 
 }
diff --git a/Assets/Scripts/TowerDefense/Agents/Agent.cs b/Assets/Scripts/TowerDefense/Agents/Agent.cs
index 3f884c7..2fceb1c 100644
--- a/Assets/Scripts/TowerDefense/Agents/Agent.cs
+++ b/Assets/Scripts/TowerDefense/Agents/Agent.cs
@@ -401,7 +401,7 @@
         /// 处理Agent的锁定Buf,播放特效,设置速度为零,并时间到达后重设数据。
         /// </summary>
         /// <param name="binfo"></param>
-        protected void SetAgentStopBuff(buffinfo binfo)
+        protected virtual void SetAgentStopBuff(buffinfo binfo)
         {
             MoveStopTime = binfo.last / 1000;
 
diff --git a/Assets/Scripts/TowerDefense/Agents/BubbleBombAgent.cs b/Assets/Scripts/TowerDefense/Agents/BubbleBombAgent.cs
index 5193cb9..662077d 100644
--- a/Assets/Scripts/TowerDefense/Agents/BubbleBombAgent.cs
+++ b/Assets/Scripts/TowerDefense/Agents/BubbleBombAgent.cs
@@ -1,3 +1,4 @@
+using DG.Tweening;
 using Core.Utilities;
 using UnityEngine;
 
@@ -104,7 +105,19 @@
 
         protected override void Update()
         {
-            
+
+        }
+
+        public override void Initialize()
+        {
+            this.configuration.bInvincible = true;
+            mDefaultScale = this.transform.localScale;
+            Sequence agentTweenSeq = DOTween.Sequence();
+            var ss = mDefaultScale * 0.3f;
+            this.transform.localScale = this.transform.localScale * 0.3f;
+            Tweener agScale = this.transform.DOScale(mDefaultScale, 0.3f);
+            agentTweenSeq.Append(agScale);
+            agentTweenSeq.AppendCallback(beDamageStart);
         }
     }
 }
\ No newline at end of file
diff --git a/Assets/Scripts/TowerDefense/Agents/WoodPileAgent.cs b/Assets/Scripts/TowerDefense/Agents/WoodPileAgent.cs
new file mode 100644
index 0000000..8ac9530
--- /dev/null
+++ b/Assets/Scripts/TowerDefense/Agents/WoodPileAgent.cs
@@ -0,0 +1,114 @@
+using Core.Utilities;
+using KTGMGemClient;
+using DG.Tweening;
+using UnityEngine;
+
+/**
+ * 木桩墙壁
+ * @Author: chenxin
+ * @Date: 2020-11-07 11:13:25
+ */
+namespace TowerDefense.Agents
+{
+    public class WoodPileAgent : Agent
+    {
+        /// <summary>
+        /// 外部赋值,唯一标识一个泡泡炸弹代理
+        /// </summary>
+        public int Id { get; set; }
+
+        /// <summary>
+        ///  木桩墙壁收到货塔攻击的额外伤害倍率
+        /// </summary>
+        public float FireHurtRate { get; set; }
+
+        /// <summary>
+        /// Peforms the relevant path update
+        /// 执行相关路径更新
+        /// </summary>
+        protected override void PathUpdate()
+        {
+
+        }
+
+        /// <summary>
+        /// The behaviour for when the agent has been blocked
+        /// 代理被阻止时的行为
+        /// </summary>
+        protected override void OnPartialPathUpdate()
+        {
+
+        }
+
+        protected override void Update()
+        {
+
+        }
+
+        /// <summary>
+        /// Stops the navMeshAgent and attempts to return to pool
+        /// </summary>
+        public override void Remove()
+        {
+            // 统一管理器内删除当前的Agent:
+            AgentInsManager.instance.removeAgent(this);
+
+            configuration.SetHealth(0);
+            OnRemoved();
+
+            if (m_NavMeshAgent.enabled)
+            {
+                m_NavMeshAgent.isStopped = true;
+            }
+            m_NavMeshAgent.enabled = false;
+
+            // 必须要重置数据,不然会有一系列的小Bug.
+            this.m_CurrentNode = null;
+            m_NextNode = null;
+
+            this.liveID = this.liveID + 1;
+            bInDeathAct = false;
+
+            // 删除当前停止特效和状态.
+            if (MoveStopTime > 0)
+                MoveStopTime = 0.0f;
+
+            Poolable.TryPool(gameObject);
+        }
+
+        protected override void SetAgentStopBuff(buffinfo binfo)
+        {
+            // 本来木桩也不会动
+        }
+
+        /// <summary>	
+        /// Setup all the necessary parameters for this agent from configuration data
+        /// </summary>
+        public override void Initialize()
+        {
+            configuration.SetHealth(configuration.maxHealth);
+            state = isPathBlocked ? State.OnPartialPath : State.OnCompletePath;
+
+            // 设置一个DOTween队列,让场景内刷出来的Agent有一个变大淡出的效果,此时是无敌效果加持.
+            this.configuration.bInvincible = true;
+            mDefaultScale = this.transform.localScale;
+            Sequence agentTweenSeq = DOTween.Sequence();
+            var ss = mDefaultScale * 0.3f;
+            this.transform.localScale = this.transform.localScale * 0.3f;
+            Tweener agScale = this.transform.DOScale(mDefaultScale, 0.3f);
+            agentTweenSeq.Append(agScale);
+            agentTweenSeq.AppendCallback(beDamageStart);
+
+            this.nodeMoveUpdate = false;
+
+            // 获取移动速度
+            fMoveSpeed = this.m_NavMeshAgent.speed / 2.0f;
+        }
+
+        public override void PlayDeath()
+        {
+            EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.EndlessWoodPileBeKilled, Id);
+            Remove();
+        }
+    }
+}
\ No newline at end of file
diff --git a/Assets/Scripts/TowerDefense/Agents/WoodPileAgent.cs.meta b/Assets/Scripts/TowerDefense/Agents/WoodPileAgent.cs.meta
new file mode 100644
index 0000000..9e3d797
--- /dev/null
+++ b/Assets/Scripts/TowerDefense/Agents/WoodPileAgent.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 74cdda61650491a4fb62ef5cac504f6e
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/TowerDefense/Towers/Projectiles/BallisticAttack.cs b/Assets/Scripts/TowerDefense/Towers/Projectiles/BallisticAttack.cs
index 8b48756..089f629 100644
--- a/Assets/Scripts/TowerDefense/Towers/Projectiles/BallisticAttack.cs
+++ b/Assets/Scripts/TowerDefense/Towers/Projectiles/BallisticAttack.cs
@@ -36,7 +36,8 @@
         /// 处理代理收到的伤害,这里需要判断代理的类型分别去处理
         /// </summary>
         /// <param name="enemy"></param>
-        public void DealDamage(Targetable enemy)
+        /// <param name="attributeId">子弹的属性id</param>
+        public void DealDamage(Targetable enemy, int attributeId = -1)
         {
             switch ((enemy as Agent).AgentType)
             {
@@ -47,11 +48,31 @@
                     HandleBubbleBomb(enemy);
                     break;
                 case SpawnAgentType.WoodPile:
+                    HandleWoodPile(enemy, attributeId);
                     break;
             }
         }
 
         /// <summary>
+        /// 处理木桩墙壁收到的伤害
+        /// </summary>
+        /// <param name="enemy"></param>
+        private void HandleWoodPile(Targetable enemy, int id)
+        {
+            float finalDamage = damager.finalDamage;
+
+            if (id == 10101)
+                finalDamage *= (enemy as WoodPileAgent).FireHurtRate;
+
+            int tid = enemy.liveID;
+            Vector3 backPos = enemy.position;
+
+            // 这里也可以把碰撞点传进来
+            enemy.TakeDamage(finalDamage, enemy.position, damager.alignmentProvider);
+            EndlessGameUI.instance.generateBloodText(backPos, finalDamage);
+        }
+
+        /// <summary>
         /// 处理泡泡炸弹收到的伤害
         /// </summary>
         /// <param name="enemy"></param>
diff --git a/Assets/Scripts/TowerDefense/UI/EndlessBossSkill/BossSkillBubbleBomb.cs b/Assets/Scripts/TowerDefense/UI/EndlessBossSkill/BossSkillBubbleBomb.cs
index c459c66..bf9d957 100644
--- a/Assets/Scripts/TowerDefense/UI/EndlessBossSkill/BossSkillBubbleBomb.cs
+++ b/Assets/Scripts/TowerDefense/UI/EndlessBossSkill/BossSkillBubbleBomb.cs
@@ -12,6 +12,9 @@
  */
 namespace KTGMGemClient
 {
+    /// <summary>
+    /// 泡泡炸弹配置数据
+    /// </summary>
     public class BubbleBombConfig
     {
         public BubbleBombAgent Agent { get; set; }
@@ -81,10 +84,7 @@
 
     public class BossSkillBubbleBomb : EndlessBossSkill
     {
-        public BossSkillBubbleBomb(boss_skill param) : base(param)
-        {
-            random = new System.Random();
-        }
+        public BossSkillBubbleBomb(boss_skill param) : base(param) { }
 
         /// <summary>
         /// 被攻击的次数
@@ -97,8 +97,6 @@
         /// 所有存在于场景中的泡泡炸弹
         /// </summary>
         protected List<BubbleBombConfig> bubbleBombList;
-
-        protected System.Random random;
 
         /// <summary>
         /// 泡泡炸弹对象池
@@ -118,7 +116,6 @@
         {
             base.ReleaseSkill();
             Debug.Log("--------------------- 泡泡炸弹释放 ---------------------");
-            // cx test
             SpawnBubbleBomb();
         }
 
@@ -159,6 +156,7 @@
                 bubbleBomb.AgentType = SpawnAgentType.BubbleBomb;
                 bubbleBomb.opponentAgent = false;
                 bubbleBomb.Reset();
+                bubbleBomb.Initialize();
 
                 // 出生位置
                 Vector3 spawnPosition = EndlessLevelManager.instance.GetTunelWorldPosition(tunelIdList[i], (EndlessBossSkillTunelType)SkillData.target[1]);
@@ -176,39 +174,6 @@
                 config.MoveSpeed = SkillData.effect[1];
                 bubbleBombList.Add(config);
             }
-        }
-
-        /// <summary>
-        /// 获取赛道列表
-        /// </summary>
-        protected List<int> GetTunelList()
-        {
-            List<int> tunelIdList = new List<int>();
-            int count = 0;
-            // 剩余没有用到的赛道
-            List<int> remainList = new List<int>() { 1, 2, 3, 4, 5 };
-
-            for (int i = 0; i < SkillData.tunnel.Count; ++i)
-            {
-                // 统计6这种类型的数量
-                if (SkillData.tunnel[i] == 6)
-                {
-                    ++count;
-                    continue;
-                }
-
-                tunelIdList.Add(SkillData.tunnel[i]);
-                remainList.Remove(SkillData.tunnel[i]);
-            }
-
-            for (int i = 0; i < count; ++i)
-            {
-                int num = random.Next(remainList.Count);
-                tunelIdList.Add(remainList[num]);
-                remainList.Remove(remainList[num]);
-            }
-
-            return tunelIdList;
         }
 
         public override void Reset()
@@ -338,6 +303,7 @@
                     if (config.Agent.bInDeathState) return;
 
                     ++config.AttackCount;
+                    Debug.Log($"--------------------- BubbleBombAgent Id: {id}, AttackCount:{config.AttackCount} ---------------------");
 
                     if (config.AttackCount >= config.NeedAttackCount)
                         AgentDead(config);
diff --git a/Assets/Scripts/TowerDefense/UI/EndlessBossSkill/BossSkillWoodPile.cs b/Assets/Scripts/TowerDefense/UI/EndlessBossSkill/BossSkillWoodPile.cs
index 994b011..55e1712 100644
--- a/Assets/Scripts/TowerDefense/UI/EndlessBossSkill/BossSkillWoodPile.cs
+++ b/Assets/Scripts/TowerDefense/UI/EndlessBossSkill/BossSkillWoodPile.cs
@@ -1,7 +1,11 @@
+using System.Collections.Generic;
 using UnityEngine;
+using Core.Utilities;
+using TowerDefense.Agents;
+using TowerDefense.Level;
 
 /**
- * 召唤木桩
+ * 召唤木桩墙壁
  * @Author: chenxin
  * @Date: 2020-11-02 17:15:39
  */
@@ -11,23 +15,102 @@
     {
         public BossSkillWoodPile(boss_skill param) : base(param) { }
 
+        protected string prefabPath = "Prefabs/Endless/WoodPile";
+
+        /// <summary>
+        /// 保存所有还在场景中的agent用于清理
+        /// </summary>
+        protected List<WoodPileAgent> agentList;
+
         /// <summary>
         /// 释放技能
         /// </summary>
         public override void ReleaseSkill()
         {
+            base.ReleaseSkill();
+            SpawnOnTunel();
+        }
 
+        protected void SpawnOnTunel()
+        {
+            List<int> tunelIdList = GetTunelList();
+            GameObject prefab = Resources.Load<GameObject>(prefabPath);
+
+            for (int i = 0; i < tunelIdList.Count; ++i)
+            {
+                GameObject obj = Poolable.TryGetPoolable(prefab);
+                WoodPileAgent agent = obj.GetComponent<WoodPileAgent>();
+
+                agent.Id = GameUtils.GetId();
+                agent.waveLineID = tunelIdList[i] - 1;
+                agent.AgentType = SpawnAgentType.WoodPile;
+                agent.opponentAgent = false;
+                agent.FireHurtRate = SkillData.effect[1];
+
+                Vector3 spawnPosition = EndlessLevelManager.instance.GetTunelWorldPosition(tunelIdList[i], (EndlessBossSkillTunelType)SkillData.target[1]);
+                obj.transform.position = spawnPosition;
+                agent.Initialize();
+
+                float enemiesTotalHP = EndlessPortData.GetWaveEnemiesHP(EndlessLevelManager.instance.CurrentLevel, EndlessLevelManager.instance.WaveManager.CurrentWaveIndex, tunelIdList[i]);
+                // 当前波次怪物 * 倍数
+                float hp = enemiesTotalHP * SkillData.effect[0];
+                agent.SetAgentData(hp, 0, 0);
+                AgentInsManager.instance.addAgent(agent);
+                agentList.Add(agent);
+            }
         }
 
         public override void Init()
         {
             base.Init();
             Debug.Log("--------------------- 召唤木桩技能初始化 ---------------------");
+            agentList = new List<WoodPileAgent>();
         }
 
-        public override void Update(float deltaTime)
+        protected override void AddEvent()
         {
-            IsCDCompleted = false;
+            EventCenter.Ins.Add<int>((int)KTGMGemClient.EventType.EndlessWoodPileBeKilled, OnWoodPileAgentRemoved);
+        }
+
+        protected override void RemoveEvent()
+        {
+            EventCenter.Ins.Add<int>((int)KTGMGemClient.EventType.EndlessWoodPileBeKilled, OnWoodPileAgentRemoved);
+        }
+
+        private void OnWoodPileAgentRemoved(int id)
+        {
+            for (int i = 0; i < agentList.Count; ++i)
+            {
+                if (agentList[i].Id == id)
+                {
+                    agentList.Remove(agentList[i]);
+                    break;
+                }
+            }
+        }
+
+        public override void Reset()
+        {
+            base.Reset();
+            ClearWoodPileAgents();
+        }
+
+        public override void Clear()
+        {
+            base.Clear();
+            ClearWoodPileAgents();
+        }
+
+        /// <summary>
+        /// 清理在场景中的所有木桩墙壁
+        /// </summary>
+        private void ClearWoodPileAgents()
+        {
+            while (agentList.Count > 0)
+            {
+                agentList[0].Remove();
+                agentList.Remove(agentList[0]);
+            }
         }
     }
 }
\ No newline at end of file
diff --git a/Assets/Scripts/TowerDefense/UI/EndlessBossSkill/EndlessBossSkill.cs b/Assets/Scripts/TowerDefense/UI/EndlessBossSkill/EndlessBossSkill.cs
index e3a5d05..cb76714 100644
--- a/Assets/Scripts/TowerDefense/UI/EndlessBossSkill/EndlessBossSkill.cs
+++ b/Assets/Scripts/TowerDefense/UI/EndlessBossSkill/EndlessBossSkill.cs
@@ -1,3 +1,4 @@
+using System.Collections.Generic;
 using Core.Utilities;
 
 /**
@@ -14,6 +15,7 @@
             SkillData = param;
             SkillType = (EndlessBossSkillType)param.skill_class;
             SkillAI = GetSkillAI(param);
+            random = new System.Random();
         }
 
         /// <summary>
@@ -46,6 +48,8 @@
         /// 技能cd的计时器
         /// </summary>
         protected Timer cdTimer;
+
+        protected System.Random random;
 
         /// <summary>
         /// 帧刷新
@@ -100,7 +104,7 @@
             cdTimer.SetTime(SkillData.cool_down / 1000f);
             cdTimer.Reset();
         }
-        
+
         public virtual void Reset()
         {
             if (cdTimer != null)
@@ -124,12 +128,45 @@
 
         protected virtual void AddEvent()
         {
-            
+
         }
 
         protected virtual void RemoveEvent()
         {
-            
+
+        }
+
+        /// <summary>
+        /// 获取赛道列表
+        /// </summary>
+        protected List<int> GetTunelList()
+        {
+            List<int> tunelIdList = new List<int>();
+            int count = 0;
+            // 剩余没有用到的赛道
+            List<int> remainList = new List<int>() { 1, 2, 3, 4, 5 };
+
+            for (int i = 0; i < SkillData.tunnel.Count; ++i)
+            {
+                // 统计6这种类型的数量
+                if (SkillData.tunnel[i] == 6)
+                {
+                    ++count;
+                    continue;
+                }
+
+                tunelIdList.Add(SkillData.tunnel[i]);
+                remainList.Remove(SkillData.tunnel[i]);
+            }
+
+            for (int i = 0; i < count; ++i)
+            {
+                int num = random.Next(remainList.Count);
+                tunelIdList.Add(remainList[num]);
+                remainList.Remove(remainList[num]);
+            }
+
+            return tunelIdList;
         }
     }
 }
\ No newline at end of file
diff --git a/Assets/Scripts/TowerDefense/UI/EndlessBossSkill/EndlessBossSkillManager.cs b/Assets/Scripts/TowerDefense/UI/EndlessBossSkill/EndlessBossSkillManager.cs
index 37b9e53..83117e5 100644
--- a/Assets/Scripts/TowerDefense/UI/EndlessBossSkill/EndlessBossSkillManager.cs
+++ b/Assets/Scripts/TowerDefense/UI/EndlessBossSkill/EndlessBossSkillManager.cs
@@ -71,6 +71,17 @@
         {
             if (isPaused || EndlessGameUI.instance.state == EndlessGameUI.State.GameOver) return;
 
+            for (int i = 0; i < skillList.Count; ++i)
+            {
+                skillList[i].Update(Time.deltaTime);
+            }
+
+            for (int i = 0; i < waitList.Count; ++i)
+            {
+                if (waitList[i].IsCDCompleted)
+                    AddSkill(waitList[i]);
+            }
+
             switch (skillState)
             {
                 case EndlessBossSkillState.Init:
@@ -114,14 +125,6 @@
 
         private void HandleWait(float deltaTime)
         {
-            for (int i = 0; i < skillList.Count; ++i)
-            {
-                skillList[i].Update(Time.deltaTime);
-
-                if (skillList[i].IsCDCompleted)
-                    AddSkill(skillList[i]);
-            }
-
             for (int i = 0; i < cdList.Count; ++i)
             {
                 if (cdList[i].IsConditionOK)
@@ -136,6 +139,9 @@
             }
         }
 
+        /// <summary>
+        /// 飘字闪烁完成
+        /// </summary>
         private void OnGlintTitleCompleted()
         {
             EventCenter.Ins.Remove((int)KTGMGemClient.EventType.EndlessBossSkillGlintTitleCompleted, OnGlintTitleCompleted);
@@ -166,6 +172,7 @@
                 {
                     skillList.Add(skill);
                     skill.Init();
+                    waitList.Add(skill);
                 }
             }
 
@@ -198,7 +205,7 @@
         public void Reset()
         {
             if (isPaused) return;
-            
+
             for (int i = 0; i < skillList.Count; ++i)
             {
                 skillList[i].Reset();
diff --git a/Assets/Scripts/TowerDefense/UI/EndlessBossSkillAI/EndlessBossSkillAI.cs b/Assets/Scripts/TowerDefense/UI/EndlessBossSkillAI/EndlessBossSkillAI.cs
index ac027cb..cc9a5ea 100644
--- a/Assets/Scripts/TowerDefense/UI/EndlessBossSkillAI/EndlessBossSkillAI.cs
+++ b/Assets/Scripts/TowerDefense/UI/EndlessBossSkillAI/EndlessBossSkillAI.cs
@@ -73,7 +73,7 @@
         }
 
         /// <summary>
-        /// 重置AI
+        /// 重置AI,恢复到初始状态
         /// </summary>
         public abstract void Reset();
 
diff --git a/Assets/Scripts/TowerDefense/UI/EndlessBossSkillAI/NormalBossSkillAI.cs b/Assets/Scripts/TowerDefense/UI/EndlessBossSkillAI/NormalBossSkillAI.cs
index d2852a7..4befbf7 100644
--- a/Assets/Scripts/TowerDefense/UI/EndlessBossSkillAI/NormalBossSkillAI.cs
+++ b/Assets/Scripts/TowerDefense/UI/EndlessBossSkillAI/NormalBossSkillAI.cs
@@ -25,7 +25,16 @@
             {
                 IsActived = true;
                 timer = null;
-                Debug.Log("--------------------- 技能准备完成 ---------------------");
+
+                switch ((EndlessBossSkillType)SkillData.skill_class)
+                {
+                    case EndlessBossSkillType.BubbleBomb:
+                        Debug.Log("--------------------- 泡泡炸弹 技能准备完成 ---------------------");
+                        break;
+                    case EndlessBossSkillType.WoodPile:
+                        Debug.Log("--------------------- 木桩墙壁 技能准备完成 ---------------------");
+                        break;
+                }
             }
         }
 

--
Gitblit v1.9.1