Parcourir la source

Enemy基本逻辑

wulifu il y a 1 an
Parent
commit
194f228436

+ 53 - 3
ActionTowerDefense/Assets/Resources/Prefab/Demonic_Arrow.prefab

@@ -16,7 +16,7 @@ GameObject:
   - component: {fileID: 3955218235338319893}
   m_Layer: 7
   m_Name: Spine
-  m_TagString: Demonic
+  m_TagString: Untagged
   m_Icon: {fileID: 0}
   m_NavMeshLayer: 0
   m_StaticEditorFlags: 0
@@ -158,7 +158,52 @@ BoxCollider:
   m_IsTrigger: 0
   m_Enabled: 1
   serializedVersion: 2
-  m_Size: {x: 2, y: 4.4, z: 0}
+  m_Size: {x: 2, y: 4.4, z: 1}
+  m_Center: {x: 0, y: 2.2, z: 0}
+--- !u!1 &5388987656270167698
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 5101632837952520453}
+  - component: {fileID: 6832657651774999176}
+  m_Layer: 0
+  m_Name: BeSearchTrigger
+  m_TagString: Demonic
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &5101632837952520453
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5388987656270167698}
+  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_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 8639832132491289354}
+  m_RootOrder: 2
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!65 &6832657651774999176
+BoxCollider:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5388987656270167698}
+  m_Material: {fileID: 0}
+  m_IsTrigger: 1
+  m_Enabled: 1
+  serializedVersion: 2
+  m_Size: {x: 2, y: 4.4, z: 1}
   m_Center: {x: 0, y: 2.2, z: 0}
 --- !u!1 &8639832132450015563
 GameObject:
@@ -171,7 +216,7 @@ GameObject:
   - component: {fileID: 8639832132450015556}
   - component: {fileID: 8639832132450015557}
   - component: {fileID: 8639832132450015562}
-  m_Layer: 7
+  m_Layer: 0
   m_Name: Foot
   m_TagString: Untagged
   m_Icon: {fileID: 0}
@@ -251,6 +296,7 @@ Transform:
   m_Children:
   - {fileID: 2983912410871356969}
   - {fileID: 8639832132450015556}
+  - {fileID: 5101632837952520453}
   m_Father: {fileID: 0}
   m_RootOrder: 0
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
@@ -283,6 +329,10 @@ MonoBehaviour:
   totalAttack1Time: 1.8
   totalAttack2Time: 1.3
   isDie: 0
+  totalHp: 100
+  hp: 0
+  canFly: 0
+  attackDistance: 0
 --- !u!54 &8639832132491289349
 Rigidbody:
   m_ObjectHideFlags: 0

+ 53 - 3
ActionTowerDefense/Assets/Resources/Prefab/Demonic_Giant.prefab

@@ -1,5 +1,50 @@
 %YAML 1.1
 %TAG !u! tag:unity3d.com,2011:
+--- !u!1 &4480734502875862885
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 6207242290232856985}
+  - component: {fileID: 637278332454425733}
+  m_Layer: 0
+  m_Name: BeSearchTrigger
+  m_TagString: Demonic
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &6207242290232856985
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4480734502875862885}
+  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_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 5440846222648032754}
+  m_RootOrder: 2
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!65 &637278332454425733
+BoxCollider:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4480734502875862885}
+  m_Material: {fileID: 0}
+  m_IsTrigger: 1
+  m_Enabled: 1
+  serializedVersion: 2
+  m_Size: {x: 10, y: 12, z: 1}
+  m_Center: {x: 0, y: 6, z: 0}
 --- !u!1 &5440846222604650419
 GameObject:
   m_ObjectHideFlags: 0
@@ -11,7 +56,7 @@ GameObject:
   - component: {fileID: 5440846222604650428}
   - component: {fileID: 5440846222604650429}
   - component: {fileID: 5440846222604650418}
-  m_Layer: 7
+  m_Layer: 0
   m_Name: Foot
   m_TagString: Untagged
   m_Icon: {fileID: 0}
@@ -91,6 +136,7 @@ Transform:
   m_Children:
   - {fileID: 3262389902459024245}
   - {fileID: 5440846222604650428}
+  - {fileID: 6207242290232856985}
   m_Father: {fileID: 0}
   m_RootOrder: 0
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
@@ -123,6 +169,10 @@ MonoBehaviour:
   totalAttack1Time: 3.6
   totalAttack2Time: 2.2
   isDie: 0
+  totalHp: 100
+  hp: 0
+  canFly: 0
+  attackDistance: 0
 --- !u!54 &5440846222648032765
 Rigidbody:
   m_ObjectHideFlags: 0
@@ -155,7 +205,7 @@ GameObject:
   - component: {fileID: 5044525302043239493}
   m_Layer: 7
   m_Name: Spine
-  m_TagString: Demonic
+  m_TagString: Untagged
   m_Icon: {fileID: 0}
   m_NavMeshLayer: 0
   m_StaticEditorFlags: 0
@@ -297,5 +347,5 @@ BoxCollider:
   m_IsTrigger: 0
   m_Enabled: 1
   serializedVersion: 2
-  m_Size: {x: 5, y: 6, z: 0}
+  m_Size: {x: 5, y: 6, z: 1}
   m_Center: {x: 0, y: 3, z: 0}

+ 53 - 3
ActionTowerDefense/Assets/Resources/Prefab/Demonic_Sword.prefab

@@ -32,6 +32,7 @@ Transform:
   m_Children:
   - {fileID: 1971427318739414964}
   - {fileID: 2437299196663985746}
+  - {fileID: 5718990486604556333}
   m_Father: {fileID: 0}
   m_RootOrder: 0
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
@@ -64,6 +65,10 @@ MonoBehaviour:
   totalAttack1Time: 1.25
   totalAttack2Time: 1.8
   isDie: 0
+  totalHp: 100
+  hp: 0
+  canFly: 0
+  attackDistance: 0
 --- !u!54 &2437299196472462355
 Rigidbody:
   m_ObjectHideFlags: 0
@@ -91,7 +96,7 @@ GameObject:
   - component: {fileID: 2437299196663985746}
   - component: {fileID: 2437299196663985747}
   - component: {fileID: 2437299196663985756}
-  m_Layer: 7
+  m_Layer: 0
   m_Name: Foot
   m_TagString: Untagged
   m_Icon: {fileID: 0}
@@ -139,6 +144,51 @@ MonoBehaviour:
   m_Name: 
   m_EditorClassIdentifier: 
   trigGroundList: []
+--- !u!1 &6526817785665782971
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 5718990486604556333}
+  - component: {fileID: 5683702269505879586}
+  m_Layer: 0
+  m_Name: BeSearchTrigger
+  m_TagString: Demonic
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &5718990486604556333
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6526817785665782971}
+  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_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 2437299196472462364}
+  m_RootOrder: 2
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!65 &5683702269505879586
+BoxCollider:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6526817785665782971}
+  m_Material: {fileID: 0}
+  m_IsTrigger: 1
+  m_Enabled: 1
+  serializedVersion: 2
+  m_Size: {x: 2, y: 4.4, z: 1}
+  m_Center: {x: 0, y: 2.2, z: 0}
 --- !u!1 &7669620205589286043
 GameObject:
   m_ObjectHideFlags: 0
@@ -155,7 +205,7 @@ GameObject:
   - component: {fileID: 6193094671698534470}
   m_Layer: 7
   m_Name: Spine
-  m_TagString: Demonic
+  m_TagString: Untagged
   m_Icon: {fileID: 0}
   m_NavMeshLayer: 0
   m_StaticEditorFlags: 0
@@ -297,5 +347,5 @@ BoxCollider:
   m_IsTrigger: 0
   m_Enabled: 1
   serializedVersion: 2
-  m_Size: {x: 2, y: 4.4, z: 0}
+  m_Size: {x: 2, y: 4.4, z: 1}
   m_Center: {x: 0, y: 2.2, z: 0}

+ 418 - 0
ActionTowerDefense/Assets/Resources/Prefab/Enemy_Sword.prefab

@@ -0,0 +1,418 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &2437299196472462361
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 2437299196472462364}
+  - component: {fileID: 5720304588384615462}
+  - component: {fileID: 2437299196472462355}
+  m_Layer: 8
+  m_Name: Enemy_Sword
+  m_TagString: Enemy
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &2437299196472462364
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2437299196472462361}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 8.01, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children:
+  - {fileID: 1971427318739414964}
+  - {fileID: 2437299196663985746}
+  - {fileID: 2922750703785930471}
+  - {fileID: 5034931269216377232}
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &5720304588384615462
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2437299196472462361}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 7475a7d33f657b146a4994b1e02710ad, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  mecanim: {fileID: 5617185463097218335}
+  ani: {fileID: 6496896669866891404}
+  rb: {fileID: 2437299196472462355}
+  foot: {fileID: 2437299196663985756}
+  bodyCollider: {fileID: 6193094671698534470}
+  searchTrigger: {fileID: 428784489592146076}
+  extraRiseGravity: -80
+  extraFallGravity: -40
+  jumpSpeed: 25
+  maxMoveSpeed: 25
+  state: 0
+  searchState: 0
+  hurtKeepTime: 0
+  totalHurtKeepTime: 0.5
+  attackTime: 0
+  totalAttack1Time: 1.25
+  totalAttack2Time: 1.8
+  targetTypes: 00000000
+  isDie: 0
+  totalHp: 100
+  hp: 0
+  attackDistance: 0
+  canFly: 0
+  canHitFly: 0
+  targetDemonic: {fileID: 0}
+  targetTower: {fileID: 0}
+  targetPlayer: {fileID: 0}
+--- !u!54 &2437299196472462355
+Rigidbody:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2437299196472462361}
+  serializedVersion: 2
+  m_Mass: 1
+  m_Drag: 0
+  m_AngularDrag: 0.05
+  m_UseGravity: 1
+  m_IsKinematic: 0
+  m_Interpolate: 0
+  m_Constraints: 120
+  m_CollisionDetection: 0
+--- !u!1 &2437299196663985757
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 2437299196663985746}
+  - component: {fileID: 2437299196663985747}
+  - component: {fileID: 2437299196663985756}
+  m_Layer: 0
+  m_Name: Foot
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &2437299196663985746
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2437299196663985757}
+  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_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 2437299196472462364}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!65 &2437299196663985747
+BoxCollider:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2437299196663985757}
+  m_Material: {fileID: 0}
+  m_IsTrigger: 1
+  m_Enabled: 1
+  serializedVersion: 2
+  m_Size: {x: 1.2, y: 0.003, z: 1}
+  m_Center: {x: 0, y: 0, z: 0}
+--- !u!114 &2437299196663985756
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2437299196663985757}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: c42213c575288a148b692aad7ab56bab, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  trigGroundList: []
+--- !u!1 &3917432747505904452
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 5034931269216377232}
+  - component: {fileID: 8107402525806353083}
+  m_Layer: 0
+  m_Name: BeSearchTrigger
+  m_TagString: Enemy
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &5034931269216377232
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3917432747505904452}
+  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_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 2437299196472462364}
+  m_RootOrder: 3
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!65 &8107402525806353083
+BoxCollider:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3917432747505904452}
+  m_Material: {fileID: 0}
+  m_IsTrigger: 1
+  m_Enabled: 1
+  serializedVersion: 2
+  m_Size: {x: 2, y: 4.4, z: 1}
+  m_Center: {x: 0, y: 2.2, z: 0}
+--- !u!1 &6164447163453378808
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 2922750703785930471}
+  - component: {fileID: 428784489592146076}
+  - component: {fileID: 988946674126968617}
+  m_Layer: 0
+  m_Name: SearchTrigger
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &2922750703785930471
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6164447163453378808}
+  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_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 2437299196472462364}
+  m_RootOrder: 2
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &428784489592146076
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6164447163453378808}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 21f006d2c845e2e43bce70ea7a2d8dcc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  owner: {fileID: 2437299196472462361}
+  trigObjList: []
+--- !u!65 &988946674126968617
+BoxCollider:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6164447163453378808}
+  m_Material: {fileID: 0}
+  m_IsTrigger: 1
+  m_Enabled: 1
+  serializedVersion: 2
+  m_Size: {x: 40, y: 5, z: 1}
+  m_Center: {x: 0, y: 2.5, z: 0}
+--- !u!1 &7669620205589286043
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1971427318739414964}
+  - component: {fileID: 2070274865187464477}
+  - component: {fileID: 2459340336965010942}
+  - component: {fileID: 6496896669866891404}
+  - component: {fileID: 5617185463097218335}
+  - component: {fileID: 6193094671698534470}
+  m_Layer: 8
+  m_Name: Spine
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &1971427318739414964
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7669620205589286043}
+  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_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 2437299196472462364}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &2070274865187464477
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7669620205589286043}
+  m_Mesh: {fileID: 0}
+--- !u!23 &2459340336965010942
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7669620205589286043}
+  m_Enabled: 1
+  m_CastShadows: 1
+  m_ReceiveShadows: 1
+  m_DynamicOccludee: 1
+  m_StaticShadowCaster: 0
+  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: ac39ff054dbb16b47878c7b62cb4c77b, 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!95 &6496896669866891404
+Animator:
+  serializedVersion: 4
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7669620205589286043}
+  m_Enabled: 1
+  m_Avatar: {fileID: 0}
+  m_Controller: {fileID: 9100000, guid: 31802b995138f5d4199103649c865f53, type: 2}
+  m_CullingMode: 0
+  m_UpdateMode: 0
+  m_ApplyRootMotion: 0
+  m_LinearVelocityBlending: 0
+  m_StabilizeFeet: 0
+  m_WarningMessage: 
+  m_HasTransformHierarchy: 1
+  m_AllowConstantClipSamplingOptimization: 1
+  m_KeepAnimatorControllerStateOnDisable: 0
+--- !u!114 &5617185463097218335
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7669620205589286043}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f9db98c60740638449864eb028fbe7ad, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  skeletonDataAsset: {fileID: 11400000, guid: edf91fbef4dfae64a857379c927b47da, type: 2}
+  initialSkinName: 
+  fixPrefabOverrideViaMeshFilter: 2
+  initialFlipX: 0
+  initialFlipY: 0
+  updateWhenInvisible: 3
+  separatorSlotNames: []
+  zSpacing: 0
+  useClipping: 1
+  immutableTriangles: 0
+  pmaVertexColors: 1
+  clearStateOnDisable: 0
+  tintBlack: 0
+  singleSubmesh: 0
+  fixDrawOrder: 0
+  addNormals: 0
+  calculateTangents: 0
+  maskInteraction: 0
+  maskMaterials:
+    materialsMaskDisabled: []
+    materialsInsideMask: []
+    materialsOutsideMask: []
+  disableRenderingOnOverride: 1
+  translator:
+    autoReset: 1
+    useCustomMixMode: 1
+    layerMixModes: 01000000
+    layerBlendModes: 01000000
+  updateTiming: 1
+--- !u!65 &6193094671698534470
+BoxCollider:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7669620205589286043}
+  m_Material: {fileID: 13400000, guid: ae11ca82bc783194e8fdded3f8828a76, type: 2}
+  m_IsTrigger: 0
+  m_Enabled: 1
+  serializedVersion: 2
+  m_Size: {x: 2, y: 4.4, z: 1}
+  m_Center: {x: 0, y: 2.2, z: 0}

+ 7 - 0
ActionTowerDefense/Assets/Resources/Prefab/Enemy_Sword.prefab.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: aaf35db4e76c3004fb462f102cf8535f
+PrefabImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 49 - 1
ActionTowerDefense/Assets/Resources/Prefab/Player.prefab

@@ -1,5 +1,50 @@
 %YAML 1.1
 %TAG !u! tag:unity3d.com,2011:
+--- !u!1 &1367816017394770223
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 4888623876213599751}
+  - component: {fileID: 7434605738363989396}
+  m_Layer: 0
+  m_Name: BeSearchTrigger
+  m_TagString: Player
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &4888623876213599751
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1367816017394770223}
+  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_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 3571941038519084349}
+  m_RootOrder: 3
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!65 &7434605738363989396
+BoxCollider:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1367816017394770223}
+  m_Material: {fileID: 13400000, guid: 1987cb0dc79114c45b27e25ba8ddb69a, type: 2}
+  m_IsTrigger: 1
+  m_Enabled: 1
+  serializedVersion: 2
+  m_Size: {x: 1.6, y: 5, z: 1}
+  m_Center: {x: 0, y: 2.5, z: 0}
 --- !u!1 &3571941038519084344
 GameObject:
   m_ObjectHideFlags: 0
@@ -33,6 +78,7 @@ Transform:
   - {fileID: 7749421205528274812}
   - {fileID: 3571941039716665621}
   - {fileID: 3571941040047527335}
+  - {fileID: 4888623876213599751}
   m_Father: {fileID: 0}
   m_RootOrder: 0
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
@@ -92,6 +138,8 @@ MonoBehaviour:
   totalCacheRushTime: 0.1
   airJumped: 0
   isDie: 0
+  totalHp: 100
+  hp: 0
   isClickBtnJump: 0
   isClickBtnRush: 0
   isClickBtnSouth: 0
@@ -125,7 +173,7 @@ GameObject:
   - component: {fileID: 3571941039716665621}
   - component: {fileID: 3571941039716665620}
   - component: {fileID: 3571941039716665623}
-  m_Layer: 6
+  m_Layer: 0
   m_Name: Foot
   m_TagString: Untagged
   m_Icon: {fileID: 0}

+ 12 - 12
ActionTowerDefense/Assets/Resources/Spine/king_devil/king_deil_Controller.controller

@@ -7,7 +7,7 @@ AnimationClip:
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
   m_Name: run_start
-  serializedVersion: 7
+  serializedVersion: 6
   m_Legacy: 0
   m_Compressed: 0
   m_UseHighQualityCurve: 1
@@ -93,7 +93,7 @@ AnimationClip:
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
   m_Name: hitted
-  serializedVersion: 7
+  serializedVersion: 6
   m_Legacy: 0
   m_Compressed: 0
   m_UseHighQualityCurve: 1
@@ -170,7 +170,7 @@ AnimationClip:
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
   m_Name: jump
-  serializedVersion: 7
+  serializedVersion: 6
   m_Legacy: 0
   m_Compressed: 0
   m_UseHighQualityCurve: 1
@@ -256,7 +256,7 @@ AnimationClip:
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
   m_Name: fall_end
-  serializedVersion: 7
+  serializedVersion: 6
   m_Legacy: 0
   m_Compressed: 0
   m_UseHighQualityCurve: 1
@@ -394,7 +394,7 @@ AnimationClip:
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
   m_Name: die
-  serializedVersion: 7
+  serializedVersion: 6
   m_Legacy: 0
   m_Compressed: 0
   m_UseHighQualityCurve: 1
@@ -549,7 +549,7 @@ AnimationClip:
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
   m_Name: idle
-  serializedVersion: 7
+  serializedVersion: 6
   m_Legacy: 0
   m_Compressed: 0
   m_UseHighQualityCurve: 1
@@ -635,7 +635,7 @@ AnimationClip:
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
   m_Name: summon
-  serializedVersion: 7
+  serializedVersion: 6
   m_Legacy: 0
   m_Compressed: 0
   m_UseHighQualityCurve: 1
@@ -796,7 +796,7 @@ AnimationClip:
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
   m_Name: fall
-  serializedVersion: 7
+  serializedVersion: 6
   m_Legacy: 0
   m_Compressed: 0
   m_UseHighQualityCurve: 1
@@ -904,7 +904,7 @@ AnimationClip:
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
   m_Name: run
-  serializedVersion: 7
+  serializedVersion: 6
   m_Legacy: 0
   m_Compressed: 0
   m_UseHighQualityCurve: 1
@@ -990,7 +990,7 @@ AnimationClip:
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
   m_Name: attack1
-  serializedVersion: 7
+  serializedVersion: 6
   m_Legacy: 0
   m_Compressed: 0
   m_UseHighQualityCurve: 1
@@ -1206,7 +1206,7 @@ AnimationClip:
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
   m_Name: walk
-  serializedVersion: 7
+  serializedVersion: 6
   m_Legacy: 0
   m_Compressed: 0
   m_UseHighQualityCurve: 1
@@ -1344,7 +1344,7 @@ AnimationClip:
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
   m_Name: rush_loop
-  serializedVersion: 7
+  serializedVersion: 6
   m_Legacy: 0
   m_Compressed: 0
   m_UseHighQualityCurve: 1

+ 73 - 4
ActionTowerDefense/Assets/Scenes/SampleScene.unity

@@ -360,6 +360,75 @@ Transform:
   m_Father: {fileID: 0}
   m_RootOrder: 2
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1001 &792970844
+PrefabInstance:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_Modification:
+    m_TransformParent: {fileID: 0}
+    m_Modifications:
+    - target: {fileID: 2070274865187464477, guid: aaf35db4e76c3004fb462f102cf8535f, type: 3}
+      propertyPath: m_Mesh
+      value: 
+      objectReference: {fileID: 0}
+    - target: {fileID: 2437299196472462361, guid: aaf35db4e76c3004fb462f102cf8535f, type: 3}
+      propertyPath: m_Name
+      value: Enemy_Sword
+      objectReference: {fileID: 0}
+    - target: {fileID: 2437299196472462364, guid: aaf35db4e76c3004fb462f102cf8535f, type: 3}
+      propertyPath: m_RootOrder
+      value: 3
+      objectReference: {fileID: 0}
+    - target: {fileID: 2437299196472462364, guid: aaf35db4e76c3004fb462f102cf8535f, type: 3}
+      propertyPath: m_LocalPosition.x
+      value: 8.01
+      objectReference: {fileID: 0}
+    - target: {fileID: 2437299196472462364, guid: aaf35db4e76c3004fb462f102cf8535f, type: 3}
+      propertyPath: m_LocalPosition.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 2437299196472462364, guid: aaf35db4e76c3004fb462f102cf8535f, type: 3}
+      propertyPath: m_LocalPosition.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 2437299196472462364, guid: aaf35db4e76c3004fb462f102cf8535f, type: 3}
+      propertyPath: m_LocalRotation.w
+      value: 1
+      objectReference: {fileID: 0}
+    - target: {fileID: 2437299196472462364, guid: aaf35db4e76c3004fb462f102cf8535f, type: 3}
+      propertyPath: m_LocalRotation.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 2437299196472462364, guid: aaf35db4e76c3004fb462f102cf8535f, type: 3}
+      propertyPath: m_LocalRotation.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 2437299196472462364, guid: aaf35db4e76c3004fb462f102cf8535f, type: 3}
+      propertyPath: m_LocalRotation.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 2437299196472462364, guid: aaf35db4e76c3004fb462f102cf8535f, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 2437299196472462364, guid: aaf35db4e76c3004fb462f102cf8535f, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 2437299196472462364, guid: aaf35db4e76c3004fb462f102cf8535f, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 5720304588384615462, guid: aaf35db4e76c3004fb462f102cf8535f, type: 3}
+      propertyPath: maxMoveSpeed
+      value: 5
+      objectReference: {fileID: 0}
+    - target: {fileID: 5720304588384615462, guid: aaf35db4e76c3004fb462f102cf8535f, type: 3}
+      propertyPath: attackDistance
+      value: 3
+      objectReference: {fileID: 0}
+    m_RemovedComponents: []
+  m_SourcePrefab: {fileID: 100100000, guid: aaf35db4e76c3004fb462f102cf8535f, type: 3}
 --- !u!114 &1192490554 stripped
 MonoBehaviour:
   m_CorrespondingSourceObject: {fileID: 3571941038519084336, guid: 5b538f610930dd743a096c582e2810f4, type: 3}
@@ -867,10 +936,6 @@ PrefabInstance:
       propertyPath: m_Name
       value: Player
       objectReference: {fileID: 0}
-    - target: {fileID: 3571941038519084348, guid: 5b538f610930dd743a096c582e2810f4, type: 3}
-      propertyPath: m_Mesh
-      value: 
-      objectReference: {fileID: 0}
     - target: {fileID: 3571941038519084349, guid: 5b538f610930dd743a096c582e2810f4, type: 3}
       propertyPath: m_RootOrder
       value: 1
@@ -915,5 +980,9 @@ PrefabInstance:
       propertyPath: m_LocalEulerAnglesHint.z
       value: 0
       objectReference: {fileID: 0}
+    - target: {fileID: 8031175604109220779, guid: 5b538f610930dd743a096c582e2810f4, type: 3}
+      propertyPath: m_Mesh
+      value: 
+      objectReference: {fileID: 0}
     m_RemovedComponents: []
   m_SourcePrefab: {fileID: 100100000, guid: 5b538f610930dd743a096c582e2810f4, type: 3}

+ 13 - 0
ActionTowerDefense/Assets/Scripts/Demonic.cs

@@ -16,6 +16,15 @@ public enum DemonicState
     Die = 8,
 }
 
+public enum DemonicTargetType
+{
+    Player = 0,
+    Demonic = 1,
+    FlyDemonic = 2,
+    LowHPDemonic = 3,
+    Tower = 4,
+}
+
 public class Demonic : MonoBehaviour
 {
     public SkeletonMecanim mecanim;
@@ -47,6 +56,10 @@ public class Demonic : MonoBehaviour
     public float totalAttack2Time = 0.5f;
 
     public bool isDie = false;
+    public int totalHp = 100;
+    public int hp;
+    public bool canFly = false;
+    public float attackDistance;
 
     private void Awake()
     {

+ 616 - 0
ActionTowerDefense/Assets/Scripts/Enemy.cs

@@ -0,0 +1,616 @@
+using Spine.Unity;
+using Spine;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public enum EnemyState
+{
+    Idle = 0,
+    Walk = 2,
+    Rise = 3,//空中上升
+    Fall = 4,//空中下落
+    Hurt = 5,
+    Attack1 = 6,
+    Attack2 = 7,
+    Die = 8,
+}
+
+public enum EnemyTargetType
+{
+    All = 0,
+    Demonic = 1,
+    LowHPDemonic = 2,
+    Tower = 3,
+    Player = 4,
+}
+
+public enum SearchState
+{
+    NoTarget = 0,//搜索范围内没有目标
+    InSearchScope = 1,//在搜索范围内发现目标,但不在攻击范围内
+    InAttackScope = 2,//目标在攻击范围内
+}
+
+public class Enemy : MonoBehaviour
+{
+    public SkeletonMecanim mecanim;
+    public Skeleton skeleton;
+
+    public Animator ani;
+    public Rigidbody rb;
+    public Foot foot;
+    public Collider bodyCollider;
+    public SearchTrigger searchTrigger;
+
+    public float extraRiseGravity = 0; //上升时额外重力加速度
+    public float extraFallGravity = -10; //下落时额外重力加速度
+    public float jumpSpeed = 10;
+    //public float airJumpSpeed = 10;
+    public float maxMoveSpeed = 5;
+    //public float moveAcc = 5f;
+    //public float airMoveAcc = 3f;
+
+    public EnemyState state;
+    public SearchState searchState;
+    [HideInInspector]
+    public float hurtKeepTime;
+    public float totalHurtKeepTime = 0.5f;
+    [HideInInspector]
+    public float attackTime;
+    public float totalAttack1Time = 0.5f;
+    public float totalAttack2Time = 0.5f;
+
+    public List<EnemyTargetType> targetTypes;
+
+    public bool isDie = false;
+    public int totalHp = 100;
+    public int hp;
+    public float attackDistance;
+    public bool canFly = false;
+    public bool canHitFly = false;
+
+    public Demonic targetDemonic;
+    public Tower targetTower;
+    public PlayerController targetPlayer;
+
+    private void Awake()
+    {
+        if (!mecanim)
+        {
+            mecanim = GetComponentInChildren<SkeletonMecanim>();
+            skeleton = mecanim.skeleton;
+        }
+        if (!ani)
+        {
+            ani = GetComponentInChildren<Animator>();
+        }
+        ChangeState(EnemyState.Idle);
+        ChangeSearchState(SearchState.NoTarget);
+    }
+
+    private void FixedUpdate()
+    {
+        OnSearchState();
+        OnState();
+    }
+
+    public void Turn()
+    {
+        transform.localScale = new Vector3(-transform.localScale.x, transform.localScale.y, transform.localScale.z);
+    }
+
+    public Vector3 GetMoveDir()
+    {
+        Vector3 moveDir = Vector3.zero;
+        Transform targetTrans = null;
+        switch (searchState)
+        {
+            case SearchState.NoTarget:
+                moveDir = Vector3.right;
+                break;
+            case SearchState.InSearchScope:
+                targetTrans = null;
+                if (targetDemonic)
+                {
+                    targetTrans = targetDemonic.transform;
+                }
+                else if (targetTower)
+                {
+                    targetTrans = targetTower.transform;
+                }
+                else if (targetPlayer)
+                {
+                    targetTrans = targetPlayer.transform;
+                }
+                if (!targetTrans)
+                {
+                    moveDir = Vector3.zero;
+                }
+                else if (targetTrans.position.x - transform.position.x < 0)
+                {
+                    moveDir = Vector3.left;
+                }
+                else
+                {
+                    moveDir = Vector3.right;
+                }
+                break;
+            case SearchState.InAttackScope:
+                targetTrans = null;
+                if (targetDemonic)
+                {
+                    targetTrans = targetDemonic.transform;
+                }
+                else if (targetTower)
+                {
+                    targetTrans = targetTower.transform;
+                }
+                else if (targetPlayer)
+                {
+                    targetTrans = targetPlayer.transform;
+                }
+                if (!targetTrans)
+                {
+                    moveDir = Vector3.zero;
+                }
+                else if (targetTrans.position.x - transform.position.x < 0)
+                {
+                    moveDir = Vector3.left;
+                }
+                else
+                {
+                    moveDir = Vector3.right;
+                }
+                break;
+            default:
+                break;
+        }
+        return moveDir;
+    }
+
+    public bool GetAttack()
+    {
+        if (searchState == SearchState.InAttackScope)
+        {
+            return true;
+        }
+        return false;
+    }
+
+    public bool GetJump()
+    {
+        return false;
+    }
+
+    public void OnState()
+    {
+        hurtKeepTime -= Time.deltaTime;
+        attackTime -= Time.deltaTime;
+        Vector3 leftDir = GetMoveDir();
+        bool isAttack = GetAttack();
+        switch (state)
+        {
+            case EnemyState.Idle:
+                if (isAttack)
+                {
+                    ChangeState(EnemyState.Attack2);
+                    break;
+                }
+                if (!foot.TrigGround)
+                {
+                    if (rb.velocity.y > 0)
+                    {
+                        ChangeState(EnemyState.Rise);
+                        break;
+                    }
+                    else
+                    {
+                        ChangeState(EnemyState.Fall);
+                        break;
+                    }
+                }
+                if (leftDir.x > 0.3f || leftDir.x < -0.3f)
+                {
+                    ChangeState(EnemyState.Walk);
+                    break;
+                }
+                //rb.velocity = Vector3.zero;
+                break;
+            case EnemyState.Walk:
+                if (isAttack)
+                {
+                    ChangeState(EnemyState.Attack2);
+                    break;
+                }
+                if (!foot.TrigGround)
+                {
+                    if (rb.velocity.y > 0)
+                    {
+                        ChangeState(EnemyState.Rise);
+                        break;
+                    }
+                    else
+                    {
+                        ChangeState(EnemyState.Fall);
+                        break;
+                    }
+                }
+                if (leftDir.x < 0.3f && leftDir.x > -0.3f)
+                {
+                    ChangeState(EnemyState.Idle);
+                    break;
+                }
+                if (leftDir.x > 0.3f)
+                {
+                    //rb.velocity += Vector3.right * moveAcc * Time.deltaTime;
+                    rb.velocity = Vector3.right * maxMoveSpeed;
+                    //if (rb.velocity.x > maxMoveSpeed)
+                    //{
+                    //    rb.velocity = new Vector3(maxMoveSpeed, rb.velocity.y, rb.velocity.z);
+                    //}
+                    if (transform.localScale.x > 0)
+                    {
+                        Turn();
+                    }
+                }
+                else if (leftDir.x < -0.3f)
+                {
+                    //rb.velocity -= Vector3.right * moveAcc * Time.deltaTime;
+                    rb.velocity = Vector3.left * maxMoveSpeed;
+                    //if (rb.velocity.x < -maxMoveSpeed)
+                    //{
+                    //    rb.velocity = new Vector3(-maxMoveSpeed, rb.velocity.y, rb.velocity.z);
+                    //}
+                    if (transform.localScale.x < 0)
+                    {
+                        Turn();
+                    }
+                }
+                break;
+            case EnemyState.Rise:
+                if (rb.velocity.y <= 0)
+                {
+                    ChangeState(EnemyState.Fall);
+                    break;
+                }
+                //if (btnJumpPress || cacheJumpTime > 0)
+                //{
+                //    if (!airJumped && rb.velocity.y < airJumpSpeed)
+                //    {
+                //        airJumped = true;
+                //        AirJump();
+                //        break;
+                //    }
+                //}
+                
+                rb.velocity += Vector3.up * extraRiseGravity * Time.deltaTime;
+                break;
+            case EnemyState.Fall:
+                if (foot.TrigGround)
+                {
+                    ChangeState(EnemyState.Idle);
+                    break;
+                }
+                //if (foot.canStepPlayers.Count > 0)
+                //{
+                //    Jump(jumpSpeed / 2);
+                //    StepOther();
+                //    break;
+                //}
+                //if (foot.canStepEnemyList.Count > 0)
+                //{
+                //    Jump(jumpSpeed / 2);
+                //    StepEnemy();
+                //    break;
+                //}
+                //if (btnJumpPress || cacheJumpTime > 0)
+                //{
+                //    if (!airJumped)
+                //    {
+                //        airJumped = true;
+                //        AirJump();
+                //        break;
+                //    }
+                //    else if (canJumpTick >= runner.Tick)
+                //    {
+                //        Jump();
+                //        break;
+                //    }
+                //}
+                rb.velocity += Vector3.up * extraFallGravity * Time.deltaTime;
+                break;
+            case EnemyState.Hurt:
+                if (hurtKeepTime <= 0)
+                {
+                    ChangeState(EnemyState.Idle);
+                    break;
+                }
+                if (!foot.TrigGround)
+                {
+                    rb.velocity += Vector3.up * extraFallGravity * Time.deltaTime;
+                }
+                rb.velocity = rb.velocity / 5 * 4;
+                break;
+            case EnemyState.Attack1:
+                if (attackTime <= 0)
+                {
+                    ChangeState(EnemyState.Idle);
+                    break;
+                }
+                break;
+            case EnemyState.Attack2:
+                if (attackTime <= 0)
+                {
+                    ChangeState(EnemyState.Idle);
+                    break;
+                }
+                break;
+            default:
+                break;
+        }
+    }
+
+    public void ChangeState(EnemyState newState)
+    {
+        switch (state)
+        {
+            case EnemyState.Idle:
+                break;
+            case EnemyState.Walk:
+                break;
+            case EnemyState.Rise:
+                break;
+            case EnemyState.Fall:
+                break;
+            case EnemyState.Hurt:
+                break;
+            case EnemyState.Attack1:
+                break;
+            case EnemyState.Attack2:
+                break;
+            case EnemyState.Die:
+                isDie = false;
+                break;
+            default:
+                break;
+        }
+        EnemyState oldState = state;
+        state = newState;
+        switch (newState)
+        {
+            case EnemyState.Idle:
+                ani.Play("idle", 0, 0);
+                rb.velocity = Vector3.zero;
+                //animalAni.SetInteger("state", (int)PlayerState.Idle);
+                break;
+            case EnemyState.Walk:
+                ani.Play("walk", 0, 0);
+                //animalAni.SetInteger("state", (int)PlayerState.Walk);
+                break;
+            case EnemyState.Rise:
+                break;
+            case EnemyState.Fall:
+                //animalAni.SetInteger("state", (int)PlayerState.Fall);
+                break;
+            case EnemyState.Hurt:
+                ani.Play("hitted", 0, 0);
+                hurtKeepTime = totalHurtKeepTime;
+                //ani.Play("Invincible", 2, 0);
+                break;
+            case EnemyState.Attack1:
+                ani.Play("attack1", 0, 0);
+                attackTime = totalAttack1Time;
+                break;
+            case EnemyState.Attack2:
+                ani.Play("attack2", 0, 0);
+                attackTime = totalAttack2Time;
+                break;
+            case EnemyState.Die:
+                ani.Play("die", 0, 0);
+                isDie = true;
+                break;
+            default:
+                break;
+        }
+    }
+
+    public void Jump()
+    {
+        SetUpSpeed(jumpSpeed);
+        ani.Play("jump", 0, 0);
+    }
+
+    public void SetUpSpeed(float speed)
+    {
+        ChangeState(EnemyState.Rise);
+        Vector3 velocity = rb.velocity;
+        Vector3 leftDir = GetMoveDir();
+        if (leftDir.x > 0.3f)
+        {
+            if (transform.localScale.x > 0)
+            {
+                Turn();
+            }
+        }
+        else if (leftDir.x < -0.3f)
+        {
+            if (transform.localScale.x < 0)
+            {
+                Turn();
+            }
+        }
+        velocity.y = speed;
+        rb.velocity = velocity;
+        //animalAni.SetInteger("state", (int)PlayerState.Rise);
+    }
+
+    public void ChangeSearchState(SearchState newState)
+    {
+        switch (searchState)
+        {
+            case SearchState.NoTarget:
+                break;
+            case SearchState.InSearchScope:
+                break;
+            case SearchState.InAttackScope:
+                break;
+            default:
+                break;
+        }
+        searchState = newState;
+        switch (searchState)
+        {
+            case SearchState.NoTarget:
+                break;
+            case SearchState.InSearchScope:
+                break;
+            case SearchState.InAttackScope:
+                break;
+            default:
+                break;
+        }
+    }
+
+    public bool SearchTarget()
+    {
+        Demonic demonic;
+        Tower tower;
+        PlayerController player;
+        float disDemonic, disTower, disPlayer;
+        for (int i = 0; i < targetTypes.Count; i++)
+        {
+            switch (targetTypes[i])
+            {
+                case EnemyTargetType.All:
+                    demonic = searchTrigger.GetMinDisDemonic(canHitFly, out disDemonic);
+                    tower = searchTrigger.GetMinDisTower(out disTower);
+                    player = searchTrigger.GetPlayer(out disPlayer);
+                    if (disDemonic <= disTower && disDemonic <= disPlayer && demonic != null)
+                    {
+                        targetDemonic = demonic;
+                        targetTower = null;
+                        targetPlayer = null;
+                        return true;
+                    }
+                    else if (disTower <= disDemonic && disTower <= disPlayer && tower != null)
+                    {
+                        targetDemonic = null;
+                        targetTower = tower;
+                        targetPlayer = null;
+                        return true;
+                    }
+                    else if (disPlayer <= disDemonic && disPlayer <= disTower && player != null)
+                    {
+                        targetDemonic = null;
+                        targetTower = null;
+                        targetPlayer = player;
+                        return true;
+                    }
+                    break;
+                case EnemyTargetType.Demonic:
+                    demonic = searchTrigger.GetMinDisDemonic(canHitFly, out disDemonic);
+                    if (demonic != null)
+                    {
+                        targetDemonic = demonic;
+                        targetTower = null;
+                        targetPlayer = null;
+                        return true;
+                    }
+                    break;
+                case EnemyTargetType.LowHPDemonic:
+                    demonic = searchTrigger.GetMinHPDemonic(canHitFly);
+                    if (demonic != null)
+                    {
+                        targetDemonic = demonic;
+                        targetTower = null;
+                        targetPlayer = null;
+                        return true;
+                    }
+                    break;
+                case EnemyTargetType.Tower:
+                    tower = searchTrigger.GetMinDisTower(out disTower);
+                    if (tower != null)
+                    {
+                        targetDemonic = null;
+                        targetTower = tower;
+                        targetPlayer = null;
+                        return true;
+                    }
+                    break;
+                case EnemyTargetType.Player:
+                    player = searchTrigger.GetPlayer(out disPlayer);
+                    if (player != null)
+                    {
+                        targetDemonic = null;
+                        targetTower = null;
+                        targetPlayer = player;
+                        return true;
+                    }
+                    break;
+                default:
+                    break;
+            }
+        }
+        return false;
+    }
+
+    public void OnSearchState()
+    {
+        switch (searchState)
+        {
+            case SearchState.NoTarget:
+                if (SearchTarget())
+                {
+                    ChangeSearchState(SearchState.InSearchScope);
+                    break;
+                }
+                //向玩家基地移动
+                break;
+            case SearchState.InSearchScope:
+                if (!SearchTarget())
+                {
+                    targetDemonic = null;
+                    targetTower = null;
+                    targetPlayer = null;
+                    ChangeSearchState(SearchState.NoTarget);
+                    break;
+                }
+                if (targetDemonic != null && Mathf.Abs(targetDemonic.transform.position.x - transform.position.x) <= attackDistance)
+                {
+                    ChangeSearchState(SearchState.InAttackScope);
+                    break;
+                }
+                if (targetTower != null && Mathf.Abs(targetTower.transform.position.x - transform.position.x) <= attackDistance)
+                {
+                    ChangeSearchState(SearchState.InAttackScope);
+                    break;
+                }
+                if (targetPlayer != null && Mathf.Abs(targetPlayer.transform.position.x - transform.position.x) <= attackDistance)
+                {
+                    ChangeSearchState(SearchState.InAttackScope);
+                    break;
+                }
+                break;
+            case SearchState.InAttackScope:
+                if (targetDemonic != null && Mathf.Abs(targetDemonic.transform.position.x - transform.position.x) > attackDistance)
+                {
+                    ChangeSearchState(SearchState.NoTarget);
+                    break;
+                }
+                if (targetTower != null && Mathf.Abs(targetTower.transform.position.x - transform.position.x) > attackDistance)
+                {
+                    ChangeSearchState(SearchState.NoTarget);
+                    break;
+                }
+                if (targetPlayer != null && Mathf.Abs(targetPlayer.transform.position.x - transform.position.x) > attackDistance)
+                {
+                    ChangeSearchState(SearchState.NoTarget);
+                    break;
+                }
+                break;
+            default:
+                break;
+        }
+    }
+}

+ 11 - 0
ActionTowerDefense/Assets/Scripts/Enemy.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 7475a7d33f657b146a4994b1e02710ad
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 18 - 0
ActionTowerDefense/Assets/Scripts/EnemyTower.cs

@@ -0,0 +1,18 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class EnemyTower : MonoBehaviour
+{
+    // Start is called before the first frame update
+    void Start()
+    {
+        
+    }
+
+    // Update is called once per frame
+    void Update()
+    {
+        
+    }
+}

+ 11 - 0
ActionTowerDefense/Assets/Scripts/EnemyTower.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: e36e1845a7796424a82b1e0d9b8de1f9
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 2 - 0
ActionTowerDefense/Assets/Scripts/PlayerController.cs

@@ -81,6 +81,8 @@ public class PlayerController : MonoBehaviour
     public bool airJumped;
 
     public bool isDie = false;
+    public int totalHp = 100;
+    public int hp;
 
     public bool btnJumpPress
     {

+ 269 - 0
ActionTowerDefense/Assets/Scripts/SearchTrigger.cs

@@ -0,0 +1,269 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class SearchTrigger : MonoBehaviour
+{
+    public GameObject owner;
+
+    public List<GameObject> trigObjList;
+
+    private void FixedUpdate()
+    {
+        for (int i = 0; i < trigObjList.Count; i++)
+        {
+            if (trigObjList[i] == null || !trigObjList[i].activeInHierarchy)
+            {
+                trigObjList.RemoveAt(i);
+                i--;
+            }
+        }
+    }
+
+    private void OnTriggerEnter(Collider other)
+    {
+        print("OnTriggerEnter:" + other.tag);
+        if (other.CompareTag("Enemy") || other.CompareTag("Demonic") || other.CompareTag("Tower") || other.CompareTag("EnemyTower") || other.CompareTag("Player"))
+        {
+            trigObjList.Add(other.gameObject);
+        }
+    }
+
+    private void OnTriggerExit(Collider other)
+    {
+        print("OnTriggerExit:" + other.tag);
+        if (other.CompareTag("Enemy") || other.CompareTag("Demonic") || other.CompareTag("Tower") || other.CompareTag("EnemyTower") || other.CompareTag("Player"))
+        {
+            print("OnTriggerExit:" + trigObjList.Count);
+            trigObjList.Remove(other.gameObject);
+            print("Remove:" + trigObjList.Count);
+        }
+    }
+
+    public Demonic GetMinDisDemonic(bool canHitFly, out float dis)
+    {
+        Demonic minDisDemonic = null;
+        dis = 99999;
+        for (int i = 0; i < trigObjList.Count; i++)
+        {
+            if (trigObjList[i].tag == "Demonic")
+            {
+                Demonic demonic = trigObjList[i].GetComponentInParent<Demonic>();
+                if (owner.tag == "Demonic" && owner.GetComponent<Demonic>() == demonic)
+                {
+                    continue;
+                }
+                if (demonic.canFly && !canHitFly)
+                {
+                    continue;
+                }
+                if (minDisDemonic == null || Mathf.Abs(minDisDemonic.transform.position.x - owner.transform.position.x) > Mathf.Abs(demonic.transform.position.x - owner.transform.position.x))
+                {
+                    minDisDemonic = demonic;
+                    dis = Mathf.Abs(demonic.transform.position.x - owner.transform.position.x);
+                }
+            }
+        }
+        return minDisDemonic;
+    }
+
+    public Demonic GetMinHPDemonic(bool canHitFly)
+    {
+        Demonic minHPDemonic = null;
+        for (int i = 0; i < trigObjList.Count; i++)
+        {
+            if (trigObjList[i].tag == "Demonic")
+            {
+                Demonic demonic = trigObjList[i].GetComponentInParent<Demonic>();
+                if (owner.tag == "Demonic" && owner.GetComponent<Demonic>() == demonic)
+                {
+                    continue;
+                }
+                if (demonic.canFly && !canHitFly)
+                {
+                    continue;
+                }
+                if (minHPDemonic == null || minHPDemonic.hp > demonic.hp)
+                {
+                    minHPDemonic = demonic;
+                }
+            }
+        }
+        return minHPDemonic;
+    }
+
+    public Tower GetMinDisTower(out float dis)
+    {
+        Tower minDisTower = null;
+        dis = 99999;
+        for (int i = 0; i < trigObjList.Count; i++)
+        {
+            if (trigObjList[i].tag == "Tower")
+            {
+                Tower tower = trigObjList[i].GetComponentInParent<Tower>();
+                if (owner.tag == "Tower" && owner.GetComponent<Tower>() == tower)
+                {
+                    continue;
+                }
+                if (minDisTower == null || Mathf.Abs(minDisTower.transform.position.x - owner.transform.position.x) > Mathf.Abs(tower.transform.position.x - owner.transform.position.x))
+                {
+                    minDisTower = tower;
+                    dis = Mathf.Abs(tower.transform.position.x - owner.transform.position.x);
+                }
+            }
+        }
+        return minDisTower;
+    }
+
+    public PlayerController GetPlayer(out float dis)
+    {
+        dis = 99999;
+        for (int i = 0; i < trigObjList.Count; i++)
+        {
+            if (trigObjList[i].tag == "Player")
+            {
+                PlayerController player = trigObjList[i].GetComponentInParent<PlayerController>();
+                dis = Mathf.Abs(player.transform.position.x - owner.transform.position.x);
+                return player;
+            }
+        }
+        return null;
+    }
+
+
+    public Enemy GetMinDisEnemy(bool canHitFly)
+    {
+        Enemy minDisEnemy = null;
+        for (int i = 0; i < trigObjList.Count; i++)
+        {
+            if (trigObjList[i].tag == "Enemy")
+            {
+                Enemy enemy = trigObjList[i].GetComponentInParent<Enemy>();
+                if (owner.tag == "Enemy" && owner.GetComponent<Enemy>() == enemy)
+                {
+                    continue;
+                }
+                if (enemy.canFly && !canHitFly)
+                {
+                    continue;
+                }
+                if (minDisEnemy == null || Mathf.Abs(minDisEnemy.transform.position.x - owner.transform.position.x) > Mathf.Abs(enemy.transform.position.x - owner.transform.position.x))
+                {
+                    minDisEnemy = enemy;
+                }
+            }
+        }
+        return minDisEnemy;
+    }
+
+    public Enemy GetMinHPEnemy(bool canHitFly)
+    {
+        Enemy minHPEnemy = null;
+        for (int i = 0; i < trigObjList.Count; i++)
+        {
+            if (trigObjList[i].tag == "Enemy")
+            {
+                Enemy enemy = trigObjList[i].GetComponentInParent<Enemy>();
+                if (owner.tag == "Enemy" && owner.GetComponent<Enemy>() == enemy)
+                {
+                    continue;
+                }
+                if (enemy.canFly && !canHitFly)
+                {
+                    continue;
+                }
+                if (minHPEnemy == null || minHPEnemy.hp > enemy.hp)
+                {
+                    minHPEnemy = enemy;
+                }
+            }
+        }
+        return minHPEnemy;
+    }
+
+    public EnemyTower GetMinDisEnemyTower()
+    {
+        EnemyTower minDisEnemyTower = null;
+        for (int i = 0; i < trigObjList.Count; i++)
+        {
+            if (trigObjList[i].tag == "EnemyTower")
+            {
+                EnemyTower enemyTower = trigObjList[i].GetComponentInParent<EnemyTower>();
+                if (owner.tag == "EnemyTower" && owner.GetComponent<EnemyTower>() == enemyTower)
+                {
+                    continue;
+                }
+                if (minDisEnemyTower == null || Mathf.Abs(minDisEnemyTower.transform.position.x - owner.transform.position.x) > Mathf.Abs(enemyTower.transform.position.x - owner.transform.position.x))
+                {
+                    minDisEnemyTower = enemyTower;
+                }
+            }
+        }
+        return minDisEnemyTower;
+    }
+
+    public bool IsExit(Demonic demonic)
+    {
+        bool isHave = false;
+        for (int i = 0; i < trigObjList.Count; i++)
+        {
+            if (trigObjList[i].tag == "Demonic" && trigObjList[i].GetComponentInParent<Demonic>() == demonic)
+            {
+                isHave = true;
+            }
+        }
+        return !isHave;
+    }
+
+    public bool IsExit(Enemy enemy)
+    {
+        bool isHave = false;
+        for (int i = 0; i < trigObjList.Count; i++)
+        {
+            if (trigObjList[i].tag == "Enemy" && trigObjList[i].GetComponentInParent<Enemy>() == enemy)
+            {
+                isHave = true;
+            }
+        }
+        return !isHave;
+    }
+
+    public bool IsExit(Tower tower)
+    {
+        bool isHave = false;
+        for (int i = 0; i < trigObjList.Count; i++)
+        {
+            if (trigObjList[i].tag == "Tower" && trigObjList[i].GetComponentInParent<Tower>() == tower)
+            {
+                isHave = true;
+            }
+        }
+        return !isHave;
+    }
+
+    public bool IsExit(EnemyTower enemyTower)
+    {
+        bool isHave = false;
+        for (int i = 0; i < trigObjList.Count; i++)
+        {
+            if (trigObjList[i].tag == "EnemyTower" && trigObjList[i].GetComponentInParent<EnemyTower>() == enemyTower)
+            {
+                isHave = true;
+            }
+        }
+        return !isHave;
+    }
+
+    public bool IsExit(PlayerController player)
+    {
+        bool isHave = false;
+        for (int i = 0; i < trigObjList.Count; i++)
+        {
+            if (trigObjList[i].tag == "Player" && trigObjList[i].GetComponentInParent<PlayerController>() == player)
+            {
+                isHave = true;
+            }
+        }
+        return !isHave;
+    }
+}

+ 11 - 0
ActionTowerDefense/Assets/Scripts/SearchTrigger.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 21f006d2c845e2e43bce70ea7a2d8dcc
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 18 - 0
ActionTowerDefense/Assets/Scripts/Tower.cs

@@ -0,0 +1,18 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class Tower : MonoBehaviour
+{
+    // Start is called before the first frame update
+    void Start()
+    {
+        
+    }
+
+    // Update is called once per frame
+    void Update()
+    {
+        
+    }
+}

+ 11 - 0
ActionTowerDefense/Assets/Scripts/Tower.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 87455058f5cb44344ab3d9e2b68a9174
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 1 - 1
ActionTowerDefense/ProjectSettings/DynamicsManager.asset

@@ -18,7 +18,7 @@ PhysicsManager:
   m_ClothInterCollisionDistance: 0.1
   m_ClothInterCollisionStiffness: 0.2
   m_ContactsGeneration: 1
-  m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffff3fffffff3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+  m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffff3ff8ffff3ff8ffff3ff8ffff3ff8ffff3ff8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
   m_AutoSimulation: 1
   m_AutoSyncTransforms: 0
   m_ReuseCollisionCallbacks: 1

+ 6 - 3
ActionTowerDefense/ProjectSettings/TagManager.asset

@@ -6,6 +6,9 @@ TagManager:
   tags:
   - Plane
   - Demonic
+  - Enemy
+  - Tower
+  - EnemyTower
   layers:
   - Default
   - TransparentFX
@@ -15,9 +18,9 @@ TagManager:
   - UI
   - Player
   - Demonic
-  - 
-  - 
-  - 
+  - Enemy
+  - Tower
+  - EnemyTower
   - 
   - 
   -