فهرست منبع

Player、Enemy、Demonic、Tower、EnemyTower部分逻辑整合方便后续迭代

wulifu 1 سال پیش
والد
کامیت
d546773135

+ 76 - 12
ActionTowerDefense/Assets/Resources/Prefab/Demonic_Arrow.prefab

@@ -466,6 +466,66 @@ Transform:
   m_Father: {fileID: 8639832132491289354}
   m_RootOrder: 0
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &5307676761346103599
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 5016048881761595890}
+  - component: {fileID: 3566347593191160092}
+  - component: {fileID: 4334931071865358337}
+  m_Layer: 0
+  m_Name: SearchTrigger
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &5016048881761595890
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5307676761346103599}
+  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: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &3566347593191160092
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5307676761346103599}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 21f006d2c845e2e43bce70ea7a2d8dcc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  owner: {fileID: 0}
+  trigObjList: []
+--- !u!65 &4334931071865358337
+BoxCollider:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5307676761346103599}
+  m_Material: {fileID: 0}
+  m_IsTrigger: 1
+  m_Enabled: 1
+  serializedVersion: 2
+  m_Size: {x: 40, y: 3, z: 1}
+  m_Center: {x: 0, y: 1.5, z: 0}
 --- !u!1 &5388987656270167698
 GameObject:
   m_ObjectHideFlags: 0
@@ -614,7 +674,7 @@ RectTransform:
   m_Children:
   - {fileID: 4847391198550739967}
   m_Father: {fileID: 8639832132491289354}
-  m_RootOrder: 1
+  m_RootOrder: 2
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0, y: 0}
   m_AnchorMax: {x: 0, y: 0}
@@ -772,6 +832,7 @@ Transform:
   m_ConstrainProportionsScale: 0
   m_Children:
   - {fileID: 5769591908339262981}
+  - {fileID: 5016048881761595890}
   - {fileID: 152626645726552729}
   m_Father: {fileID: 0}
   m_RootOrder: 0
@@ -792,28 +853,31 @@ MonoBehaviour:
   ani: {fileID: 5978259926173120695}
   aniCollider: {fileID: 6864986857343475389}
   rb: {fileID: 8639832132491289349}
-  foot: {fileID: 8639832132450015562}
   bodyTrans: {fileID: 5769591908339262981}
   uiHp: {fileID: 3586716274361854270}
-  extraRiseGravity: -80
-  extraFallGravity: -40
-  maxMoveSpeed: 25
   state: 0
-  invincibleTime: 0
-  totalInvincibleTime: 2
-  hurtKeepTime: 0
-  totalHurtKeepTime: 0.5
   attackTime: 0
   totalAttack1Time: 1.8
-  totalAttack2Time: 1.3
   isDie: 0
   totalHp: 100
   hp: 0
   attack1Infos: []
-  attack2Infos: []
   attackTriggers: []
+  foot: {fileID: 8639832132450015562}
+  extraRiseGravity: -28.8
+  extraFallGravity: -14.4
+  maxMoveSpeed: 1.8
+  hurtKeepTime: 0
+  totalHurtKeepTime: 0.5
+  searchTrigger: {fileID: 3566347593191160092}
+  searchState: 0
+  totalAttack2Time: 1.3
+  targetTypes: 0400000005000000
+  attack2Infos: []
+  attackDistance: 10
   canFly: 0
-  attackDistance: 0
+  canHitFly: 0
+  targetCharacter: {fileID: 0}
 --- !u!54 &8639832132491289349
 Rigidbody:
   m_ObjectHideFlags: 0

+ 77 - 13
ActionTowerDefense/Assets/Resources/Prefab/Demonic_Giant.prefab

@@ -405,6 +405,7 @@ Transform:
   m_ConstrainProportionsScale: 0
   m_Children:
   - {fileID: 6459001683917408033}
+  - {fileID: 770599430276839403}
   - {fileID: 3103190932458336017}
   m_Father: {fileID: 0}
   m_RootOrder: 0
@@ -425,20 +426,11 @@ MonoBehaviour:
   ani: {fileID: 3333436509305836838}
   aniCollider: {fileID: 2776251058442384869}
   rb: {fileID: 5440846222648032765}
-  foot: {fileID: 5440846222604650418}
   bodyTrans: {fileID: 6459001683917408033}
   uiHp: {fileID: 478072938412589135}
-  extraRiseGravity: -80
-  extraFallGravity: -40
-  maxMoveSpeed: 25
   state: 0
-  invincibleTime: 0
-  totalInvincibleTime: 2
-  hurtKeepTime: 0
-  totalHurtKeepTime: 0.5
   attackTime: 0
   totalAttack1Time: 3.6
-  totalAttack2Time: 2.2
   isDie: 0
   totalHp: 100
   hp: 0
@@ -446,14 +438,26 @@ MonoBehaviour:
   - damage: 30
     attackDir: {x: -1, y: 0, z: 0}
     force: 1000
+  attackTriggers:
+  - {fileID: 7729941002223262554}
+  foot: {fileID: 5440846222604650418}
+  extraRiseGravity: -28.8
+  extraFallGravity: -14.4
+  maxMoveSpeed: 1.8
+  hurtKeepTime: 0
+  totalHurtKeepTime: 0.5
+  searchTrigger: {fileID: 2932762729738363159}
+  searchState: 0
+  totalAttack2Time: 2.2
+  targetTypes: 0400000005000000
   attack2Infos:
   - damage: 30
     attackDir: {x: -1, y: 0, z: 0}
     force: 1000
-  attackTriggers:
-  - {fileID: 7729941002223262554}
+  attackDistance: 3
   canFly: 0
-  attackDistance: 0
+  canHitFly: 0
+  targetCharacter: {fileID: 0}
 --- !u!54 &5440846222648032765
 Rigidbody:
   m_ObjectHideFlags: 0
@@ -470,6 +474,66 @@ Rigidbody:
   m_Interpolate: 0
   m_Constraints: 120
   m_CollisionDetection: 0
+--- !u!1 &6139679835290116115
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 770599430276839403}
+  - component: {fileID: 2932762729738363159}
+  - component: {fileID: 826799689842861252}
+  m_Layer: 0
+  m_Name: SearchTrigger
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &770599430276839403
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6139679835290116115}
+  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: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &2932762729738363159
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6139679835290116115}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 21f006d2c845e2e43bce70ea7a2d8dcc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  owner: {fileID: 0}
+  trigObjList: []
+--- !u!65 &826799689842861252
+BoxCollider:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6139679835290116115}
+  m_Material: {fileID: 0}
+  m_IsTrigger: 1
+  m_Enabled: 1
+  serializedVersion: 2
+  m_Size: {x: 40, y: 3, z: 1}
+  m_Center: {x: 0, y: 1.5, z: 0}
 --- !u!1 &6239053045979137450
 GameObject:
   m_ObjectHideFlags: 0
@@ -832,7 +896,7 @@ RectTransform:
   m_Children:
   - {fileID: 8277382527186776806}
   m_Father: {fileID: 5440846222648032754}
-  m_RootOrder: 1
+  m_RootOrder: 2
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0, y: 0}
   m_AnchorMax: {x: 0, y: 0}

+ 77 - 13
ActionTowerDefense/Assets/Resources/Prefab/Demonic_Sword.prefab

@@ -1,5 +1,65 @@
 %YAML 1.1
 %TAG !u! tag:unity3d.com,2011:
+--- !u!1 &78415308861180513
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 5061628209490452354}
+  - component: {fileID: 5104552355235513707}
+  - component: {fileID: 6745998926352348214}
+  m_Layer: 0
+  m_Name: SearchTrigger
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &5061628209490452354
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 78415308861180513}
+  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!114 &5104552355235513707
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 78415308861180513}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 21f006d2c845e2e43bce70ea7a2d8dcc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  owner: {fileID: 0}
+  trigObjList: []
+--- !u!65 &6745998926352348214
+BoxCollider:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 78415308861180513}
+  m_Material: {fileID: 0}
+  m_IsTrigger: 1
+  m_Enabled: 1
+  serializedVersion: 2
+  m_Size: {x: 40, y: 3, z: 1}
+  m_Center: {x: 0, y: 1.5, z: 0}
 --- !u!1 &1090663073729466903
 GameObject:
   m_ObjectHideFlags: 0
@@ -88,6 +148,7 @@ Transform:
   m_ConstrainProportionsScale: 0
   m_Children:
   - {fileID: 2730232521377132808}
+  - {fileID: 5061628209490452354}
   - {fileID: 8507731236713456294}
   m_Father: {fileID: 0}
   m_RootOrder: 0
@@ -108,20 +169,11 @@ MonoBehaviour:
   ani: {fileID: 6496896669866891404}
   aniCollider: {fileID: 7460010523729932468}
   rb: {fileID: 2437299196472462355}
-  foot: {fileID: 2437299196663985756}
   bodyTrans: {fileID: 2730232521377132808}
   uiHp: {fileID: 6433555643392153575}
-  extraRiseGravity: -80
-  extraFallGravity: -40
-  maxMoveSpeed: 25
   state: 0
-  invincibleTime: 0
-  totalInvincibleTime: 2
-  hurtKeepTime: 0
-  totalHurtKeepTime: 0.5
   attackTime: 0
   totalAttack1Time: 1.25
-  totalAttack2Time: 1.8
   isDie: 0
   totalHp: 100
   hp: 0
@@ -129,14 +181,26 @@ MonoBehaviour:
   - damage: 30
     attackDir: {x: -1, y: 0, z: 0}
     force: 1000
+  attackTriggers:
+  - {fileID: 4347565098670608659}
+  foot: {fileID: 2437299196663985756}
+  extraRiseGravity: -28.8
+  extraFallGravity: -14.4
+  maxMoveSpeed: 1.8
+  hurtKeepTime: 0
+  totalHurtKeepTime: 0.5
+  searchTrigger: {fileID: 5104552355235513707}
+  searchState: 0
+  totalAttack2Time: 1.8
+  targetTypes: 0400000005000000
   attack2Infos:
   - damage: 30
     attackDir: {x: -1, y: 0, z: 0}
     force: 1000
-  attackTriggers:
-  - {fileID: 4347565098670608659}
+  attackDistance: 1.5
   canFly: 0
-  attackDistance: 0
+  canHitFly: 0
+  targetCharacter: {fileID: 0}
 --- !u!54 &2437299196472462355
 Rigidbody:
   m_ObjectHideFlags: 0
@@ -652,7 +716,7 @@ RectTransform:
   m_Children:
   - {fileID: 6098794361404217704}
   m_Father: {fileID: 2437299196472462364}
-  m_RootOrder: 1
+  m_RootOrder: 2
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0, y: 0}
   m_AnchorMax: {x: 0, y: 0}

+ 35 - 23
ActionTowerDefense/Assets/Resources/Prefab/Enemy_Sword.prefab

@@ -200,6 +200,8 @@ Transform:
   m_ConstrainProportionsScale: 0
   m_Children:
   - {fileID: 5075820377452290163}
+  - {fileID: 2922750703785930471}
+  - {fileID: 4697794260638721214}
   m_Father: {fileID: 0}
   m_RootOrder: 0
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
@@ -219,22 +221,11 @@ MonoBehaviour:
   ani: {fileID: 6496896669866891404}
   aniCollider: {fileID: 2250177594949393219}
   rb: {fileID: 2437299196472462355}
-  foot: {fileID: 2437299196663985756}
   bodyTrans: {fileID: 5075820377452290163}
   uiHp: {fileID: 5757877461832872043}
-  searchTrigger: {fileID: 428784489592146076}
-  extraRiseGravity: -28.8
-  extraFallGravity: -14.4
-  jumpSpeed: 9
-  maxMoveSpeed: 1.8
   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
@@ -242,18 +233,27 @@ MonoBehaviour:
   - damage: 30
     attackDir: {x: -1, y: 0, z: 0}
     force: 1000
+  attackTriggers:
+  - {fileID: 2280520615464243483}
+  foot: {fileID: 2437299196663985756}
+  extraRiseGravity: -28.8
+  extraFallGravity: -14.4
+  maxMoveSpeed: 1.8
+  hurtKeepTime: 0
+  totalHurtKeepTime: 0.5
+  searchTrigger: {fileID: 428784489592146076}
+  jumpSpeed: 9
+  searchState: 0
+  totalAttack2Time: 1.8
+  targetTypes: 010000000300000002000000
   attack2Infos:
   - damage: 30
     attackDir: {x: -1, y: 0, z: 0}
     force: 1000
-  attackTriggers:
-  - {fileID: 2280520615464243483}
   attackDistance: 1.5
   canFly: 0
   canHitFly: 0
-  targetDemonic: {fileID: 0}
-  targetTower: {fileID: 0}
-  targetPlayer: {fileID: 0}
+  targetCharacter: {fileID: 0}
 --- !u!54 &2437299196472462355
 Rigidbody:
   m_ObjectHideFlags: 0
@@ -359,7 +359,6 @@ Transform:
   m_Children:
   - {fileID: 1971427318739414964}
   - {fileID: 7178342375467680425}
-  - {fileID: 4697794260638721214}
   m_Father: {fileID: 2437299196472462364}
   m_RootOrder: 0
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
@@ -449,6 +448,7 @@ GameObject:
   m_Component:
   - component: {fileID: 5034931269216377232}
   - component: {fileID: 8107402525806353083}
+  - component: {fileID: 6542925321707027015}
   m_Layer: 0
   m_Name: BeSearchTrigger
   m_TagString: Untagged
@@ -469,7 +469,7 @@ Transform:
   m_ConstrainProportionsScale: 0
   m_Children: []
   m_Father: {fileID: 7178342375467680425}
-  m_RootOrder: 4
+  m_RootOrder: 3
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
 --- !u!65 &8107402525806353083
 BoxCollider:
@@ -484,6 +484,19 @@ BoxCollider:
   serializedVersion: 2
   m_Size: {x: 0.72, y: 1.584, z: 1}
   m_Center: {x: 0, y: 0.792, z: 0}
+--- !u!114 &6542925321707027015
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3917432747505904452}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 8ff1eeae99d9b8142acd628550a50e26, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  owner: {fileID: 0}
 --- !u!1 &4960124152152785005
 GameObject:
   m_ObjectHideFlags: 0
@@ -515,7 +528,7 @@ Transform:
   m_ConstrainProportionsScale: 0
   m_Children: []
   m_Father: {fileID: 7178342375467680425}
-  m_RootOrder: 5
+  m_RootOrder: 4
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
 --- !u!65 &2640996939016594402
 BoxCollider:
@@ -573,8 +586,8 @@ Transform:
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children: []
-  m_Father: {fileID: 7178342375467680425}
-  m_RootOrder: 3
+  m_Father: {fileID: 2437299196472462364}
+  m_RootOrder: 1
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
 --- !u!114 &428784489592146076
 MonoBehaviour:
@@ -635,7 +648,6 @@ Transform:
   - {fileID: 8550728524802026199}
   - {fileID: 1579580627400158104}
   - {fileID: 2437299196663985746}
-  - {fileID: 2922750703785930471}
   - {fileID: 5034931269216377232}
   - {fileID: 6936852277045865654}
   m_Father: {fileID: 5075820377452290163}
@@ -693,7 +705,7 @@ RectTransform:
   m_ConstrainProportionsScale: 0
   m_Children:
   - {fileID: 8975764532134050398}
-  m_Father: {fileID: 5075820377452290163}
+  m_Father: {fileID: 2437299196472462364}
   m_RootOrder: 2
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0, y: 0}

+ 26 - 26
ActionTowerDefense/Assets/Resources/Prefab/Player.prefab

@@ -216,7 +216,7 @@ RectTransform:
   m_Children:
   - {fileID: 205997963}
   m_Father: {fileID: 3571941038519084349}
-  m_RootOrder: 2
+  m_RootOrder: 1
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0, y: 0}
   m_AnchorMax: {x: 0, y: 0}
@@ -359,8 +359,8 @@ Transform:
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children: []
-  m_Father: {fileID: 3571941038519084349}
-  m_RootOrder: 1
+  m_Father: {fileID: 5205406772191310031}
+  m_RootOrder: 4
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
 --- !u!65 &7434605738363989396
 BoxCollider:
@@ -369,12 +369,12 @@ BoxCollider:
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 1367816017394770223}
-  m_Material: {fileID: 0}
-  m_IsTrigger: 1
+  m_Material: {fileID: 13400000, guid: 2e70fb313541af7448ba7b210cc224c5, type: 2}
+  m_IsTrigger: 0
   m_Enabled: 1
   serializedVersion: 2
-  m_Size: {x: 1.6, y: 5, z: 1}
-  m_Center: {x: 0, y: 2.5, z: 0}
+  m_Size: {x: 0.576, y: 1.8, z: 1}
+  m_Center: {x: 0, y: 0.9, z: 0}
 --- !u!114 &573198802
 MonoBehaviour:
   m_ObjectHideFlags: 0
@@ -421,6 +421,7 @@ Transform:
   - {fileID: 3571941039716665621}
   - {fileID: 1497489759038018996}
   - {fileID: 6229172248453544182}
+  - {fileID: 4888623876213599751}
   m_Father: {fileID: 2788556811231999033}
   m_RootOrder: 1
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
@@ -475,7 +476,6 @@ Transform:
   m_ConstrainProportionsScale: 0
   m_Children:
   - {fileID: 2788556811231999033}
-  - {fileID: 4888623876213599751}
   - {fileID: 1969773273}
   m_Father: {fileID: 0}
   m_RootOrder: 0
@@ -496,9 +496,26 @@ MonoBehaviour:
   ani: {fileID: 6197716555580445942}
   aniCollider: {fileID: 5072770566235913242}
   rb: {fileID: 3571941038519084339}
-  foot: {fileID: 3571941039716665623}
   bodyTrans: {fileID: 2788556811231999033}
   uiHp: {fileID: 205997967}
+  state: 1
+  attackTime: 0
+  totalAttack1Time: 1
+  isDie: 0
+  totalHp: 100
+  hp: 0
+  attack1Infos:
+  - damage: 30
+    attackDir: {x: -1, y: 0, z: 0}
+    force: 1000
+  attackTriggers:
+  - {fileID: 1267495056}
+  foot: {fileID: 3571941039716665623}
+  extraRiseGravity: -28.8
+  extraFallGravity: -14.4
+  maxMoveSpeed: 14.4
+  hurtKeepTime: 0
+  totalHurtKeepTime: 0.5
   demonicPrefabs:
   - {fileID: 8639832132491289359, guid: 4c2987691cdb47040b3a55ff928803c3, type: 3}
   - {fileID: 5440846222648032759, guid: 05825e721b2832f478f66e78daed901f, type: 3}
@@ -507,23 +524,15 @@ MonoBehaviour:
   - {x: -5, y: 0, z: 0}
   - {x: -5, y: 0, z: 0}
   - {x: -5, y: 0, z: 0}
-  extraRiseGravity: -28.8
-  extraFallGravity: -14.4
   jumpSpeed: 20
   airJumpSpeed: 15
-  maxMoveSpeed: 14.4
   rushSpeed: 54
-  state: 1
   invincibleTime: 0
   totalInvincibleTime: 2
   canJumpTime: 0
   leaveGroundCanJumpTime: 0.15
   cacheJumpTime: 0
   totalCacheJumpTime: 0.1
-  hurtKeepTime: 0
-  totalHurtKeepTime: 0.5
-  attackTime: 0
-  totalAttackTime: 1.3
   summonTime: 0
   totalSummonTime: 1
   cacheAttackTime: 0
@@ -536,15 +545,6 @@ MonoBehaviour:
   cacheRushTime: 0
   totalCacheRushTime: 0.1
   airJumped: 0
-  isDie: 0
-  totalHp: 100
-  hp: 0
-  attack1Infos:
-  - damage: 30
-    attackDir: {x: -1, y: 0, z: 0}
-    force: 1000
-  attackTriggers:
-  - {fileID: 1267495056}
   isClickBtnJump: 0
   isClickBtnRush: 0
   isClickBtnSouth: 0

+ 2 - 21
ActionTowerDefense/Assets/Scripts/AttackTrigger.cs

@@ -4,33 +4,14 @@ using UnityEngine;
 
 public class AttackTrigger : MonoBehaviour
 {
-    public GameObject owner;
+    public Character owner;
     public List<BeHitTrigger> trigedObjs;
     public int damage;
     public Vector3 force;
 
     private void Awake()
     {
-        if (GetComponentInParent<PlayerController>())
-        {
-            owner = GetComponentInParent<PlayerController>().gameObject;
-        }
-        else if (GetComponentInParent<Demonic>())
-        {
-            owner = GetComponentInParent<Demonic>().gameObject;
-        }
-        else if (GetComponentInParent<Tower>())
-        {
-            owner = GetComponentInParent<Tower>().gameObject;
-        }
-        else if (GetComponentInParent<Enemy>())
-        {
-            owner = GetComponentInParent<Enemy>().gameObject;
-        }
-        else if (GetComponentInParent<EnemyTower>())
-        {
-            owner = GetComponentInParent<EnemyTower>().gameObject;
-        }
+        owner = GetComponentInParent<Character>();
     }
 
     private void OnTriggerEnter(Collider other)

+ 3 - 46
ActionTowerDefense/Assets/Scripts/BeHitTrigger.cs

@@ -5,30 +5,11 @@ using UnityEngine.U2D;
 
 public class BeHitTrigger : MonoBehaviour
 {
-    public GameObject owner;
+    public Character owner;
 
     private void Awake()
     {
-        if (GetComponentInParent<PlayerController>())
-        {
-            owner = GetComponentInParent<PlayerController>().gameObject;
-        }
-        else if (GetComponentInParent<Demonic>())
-        {
-            owner = GetComponentInParent<Demonic>().gameObject;
-        }
-        else if (GetComponentInParent<Tower>())
-        {
-            owner = GetComponentInParent<Tower>().gameObject;
-        }
-        else if (GetComponentInParent<Enemy>())
-        {
-            owner = GetComponentInParent<Enemy>().gameObject;
-        }
-        else if (GetComponentInParent<EnemyTower>())
-        {
-            owner = GetComponentInParent<EnemyTower>().gameObject;
-        }
+        owner = GetComponentInParent<Character>();
     }
 
     private void OnTriggerEnter(Collider other)
@@ -38,30 +19,6 @@ public class BeHitTrigger : MonoBehaviour
 
     public void BeHit(int damage, Vector3 force)
     {
-        switch (owner.tag)
-        {
-            case "Player":
-                PlayerController player = owner.GetComponent<PlayerController>();
-                player.BeHit(damage, force);
-                break;
-            case "Demonic":
-                Demonic demonic = owner.GetComponent<Demonic>();
-                demonic.BeHit(damage, force);
-                break;
-            case "Tower":
-                Tower tower = owner.GetComponent<Tower>();
-                tower.BeHit(damage, force);
-                break;
-            case "Enemy":
-                Enemy enemy = owner.GetComponent<Enemy>();
-                enemy.BeHit(damage, force);
-                break;
-            case "EnemyTower":
-                EnemyTower enemyTower = owner.GetComponent<EnemyTower>();
-                enemyTower.BeHit(damage, force);
-                break;
-            default:
-                break;
-        }
+        owner.BeHit(damage, force);
     }
 }

+ 2 - 21
ActionTowerDefense/Assets/Scripts/BeSearchTrigger.cs

@@ -4,29 +4,10 @@ using UnityEngine;
 
 public class BeSearchTrigger : MonoBehaviour
 {
-    public GameObject owner;
+    public Character owner;
 
     private void Awake()
     {
-        if (GetComponentInParent<PlayerController>())
-        {
-            owner = GetComponentInParent<PlayerController>().gameObject;
-        }
-        else if (GetComponentInParent<Demonic>())
-        {
-            owner = GetComponentInParent<Demonic>().gameObject;
-        }
-        else if (GetComponentInParent<Tower>())
-        {
-            owner = GetComponentInParent<Tower>().gameObject;
-        }
-        else if (GetComponentInParent<Enemy>())
-        {
-            owner = GetComponentInParent<Enemy>().gameObject;
-        }
-        else if (GetComponentInParent<EnemyTower>())
-        {
-            owner = GetComponentInParent<EnemyTower>().gameObject;
-        }
+        owner = GetComponentInParent<Character>();
     }
 }

+ 96 - 0
ActionTowerDefense/Assets/Scripts/Character.cs

@@ -0,0 +1,96 @@
+using Spine.Unity;
+using Spine;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public enum CharacterState
+{
+    None = 0,
+    Idle = 1,
+    Run = 2,
+    Rise = 3,//¿ÕÖÐÉÏÉý
+    Fall = 4,//¿ÕÖÐÏÂÂä
+    Hurt = 5,
+    Attack = 6,
+    Summon = 7,
+    Rush = 8,
+    Die = 9,
+}
+public class Character : MonoBehaviour
+{
+    public SkeletonMecanim mecanim;
+    public Skeleton skeleton;
+
+    public Animator ani;
+    public Animator aniCollider;
+    public Rigidbody rb;
+    public Transform bodyTrans;
+    public UIHP uiHp;
+
+    public CharacterState state;
+    [HideInInspector]
+    public float attackTime;
+    public float totalAttack1Time = 0.5f;
+
+    public bool isDie = false;
+    public int totalHp = 100;
+    public int hp;
+    public List<AttackInfo> attack1Infos;
+    public List<AttackTrigger> attackTriggers;
+
+    public virtual void Init()
+    {
+        if (!mecanim)
+        {
+            mecanim = GetComponentInChildren<SkeletonMecanim>();
+            skeleton = mecanim.skeleton;
+        }
+        if (!ani)
+        {
+            ani = GetComponentInChildren<Animator>();
+        }
+    }
+
+    public virtual void Reload()
+    {
+        hp = totalHp;
+        uiHp.ShowHP(hp, totalHp);
+        ChangeState(CharacterState.Idle);
+    }
+
+    public virtual void FixedUpdate()
+    {
+        OnState();
+    }
+
+    public void Turn()
+    {
+        bodyTrans.localScale = new Vector3(-bodyTrans.localScale.x, bodyTrans.localScale.y, bodyTrans.localScale.z);
+    }
+
+    public virtual void OnState()
+    {
+
+    }
+
+    public virtual void ChangeState(CharacterState newState)
+    {
+
+    }
+
+    public virtual void BeHit(int damage, Vector3 force)
+    {
+        hp -= damage;
+        uiHp.ShowHP(hp, totalHp);
+        rb.AddForce(force);
+        if (hp < 0)
+        {
+            ChangeState(CharacterState.Die);
+        }
+        else
+        {
+            ChangeState(CharacterState.Hurt);
+        }
+    }
+}

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

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

+ 196 - 110
ActionTowerDefense/Assets/Scripts/Demonic.cs

@@ -4,65 +4,18 @@ using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 
-public enum DemonicState
+public class Demonic : MoveCharacter
 {
-    Idle = 0,
-    Walk = 2,
-    Rise = 3,//空中上升
-    Fall = 4,//空中下落
-    Hurt = 5,
-    Attack = 6,
-    Die = 7,
-}
-
-public enum DemonicTargetType
-{
-    Player = 0,
-    Demonic = 1,
-    FlyDemonic = 2,
-    LowHPDemonic = 3,
-    Tower = 4,
-}
-
-public class Demonic : MonoBehaviour
-{
-    public SkeletonMecanim mecanim;
-    public Skeleton skeleton;
-
-    public Animator ani;
-    public Animator aniCollider;
-    public Rigidbody rb;
-    public Foot foot;
-    public Transform bodyTrans;
-    public UIHP uiHp;
-
-    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 DemonicState state;
-    [HideInInspector]
-    public float invincibleTime;
-    public float totalInvincibleTime = 2f;
-    [HideInInspector]
-    public float hurtKeepTime;
-    public float totalHurtKeepTime = 0.5f;
-    [HideInInspector]
-    public float attackTime;
-    public float totalAttack1Time = 0.5f;
+    public SearchTrigger searchTrigger;
+    public SearchState searchState;
     public float totalAttack2Time = 0.5f;
-
-    public bool isDie = false;
-    public int totalHp = 100;
-    public int hp;
-    public List<AttackInfo> attack1Infos, attack2Infos;
-    public List<AttackTrigger> attackTriggers;
-    public bool canFly = false;
+    public List<TargetType> targetTypes;
+    public List<AttackInfo> attack2Infos;
     public float attackDistance;
+    public bool canFly = false;
+    public bool canHitFly = false;
+
+    public Character targetCharacter;
 
     private void Awake()
     {
@@ -81,39 +34,167 @@ public class Demonic : MonoBehaviour
     {
         totalHp = tHp;
         hp = totalHp;
-        ChangeState(DemonicState.Idle);
+        ChangeState(CharacterState.Idle);
     }
 
-    private void FixedUpdate()
+    public override void FixedUpdate()
     {
+        OnSearchState();
         OnState();
     }
 
-    public void Turn()
+    public bool SearchTarget()
     {
-        bodyTrans.localScale = new Vector3(-bodyTrans.localScale.x, bodyTrans.localScale.y, bodyTrans.localScale.z);
+        targetCharacter = searchTrigger.GetMinDisTarget(targetTypes, canHitFly);
+        if (targetCharacter != null)
+        {
+            return true;
+        }
+        else
+        {
+            return false;
+        }
+    }
+
+    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:
+                targetCharacter = null;
+                break;
+            case SearchState.InSearchScope:
+                break;
+            case SearchState.InAttackScope:
+                break;
+            default:
+                break;
+        }
+    }
+
+    public void OnSearchState()
+    {
+        switch (searchState)
+        {
+            case SearchState.NoTarget:
+                if (SearchTarget())
+                {
+                    ChangeSearchState(SearchState.InSearchScope);
+                    break;
+                }
+                //向玩家基地移动
+                break;
+            case SearchState.InSearchScope:
+                if (!SearchTarget())
+                {
+                    targetCharacter = null;
+                    ChangeSearchState(SearchState.NoTarget);
+                    break;
+                }
+                if (targetCharacter != null && Mathf.Abs(targetCharacter.transform.position.x - transform.position.x) <= attackDistance)
+                {
+                    ChangeSearchState(SearchState.InAttackScope);
+                    break;
+                }
+                break;
+            case SearchState.InAttackScope:
+                if (targetCharacter != null)
+                {
+                    if (!targetCharacter.gameObject.activeInHierarchy || targetCharacter.isDie
+                        || Mathf.Abs(targetCharacter.transform.position.x - transform.position.x) > attackDistance)
+                    {
+                        ChangeSearchState(SearchState.NoTarget);
+                    }
+                }
+                else
+                {
+                    ChangeSearchState(SearchState.NoTarget);
+                }
+                break;
+            default:
+                break;
+        }
     }
 
     public Vector3 GetMoveDir()
     {
-        return Vector3.zero;
+        Vector3 moveDir = Vector3.zero;
+        switch (searchState)
+        {
+            case SearchState.NoTarget:
+                moveDir = Vector3.right;
+                break;
+            case SearchState.InSearchScope:
+                if (targetCharacter)
+                {
+                    if (targetCharacter.transform.position.x - transform.position.x < 0)
+                    {
+                        moveDir = Vector3.left;
+                    }
+                    else
+                    {
+                        moveDir = Vector3.right;
+                    }
+                }
+                else
+                {
+                    moveDir = Vector3.zero;
+                }
+                break;
+            case SearchState.InAttackScope:
+                if (targetCharacter)
+                {
+                    if (targetCharacter.transform.position.x - transform.position.x < 0)
+                    {
+                        moveDir = Vector3.left;
+                    }
+                    else
+                    {
+                        moveDir = Vector3.right;
+                    }
+                }
+                else
+                {
+                    moveDir = Vector3.zero;
+                }
+                break;
+            default:
+                break;
+        }
+        return moveDir;
     }
 
     public bool GetAttack()
     {
+        if (searchState == SearchState.InAttackScope)
+        {
+            return true;
+        }
         return false;
     }
 
-    public void OnState()
+    public override void OnState()
     {
-        invincibleTime -= Time.deltaTime;
+        base.OnState();
         hurtKeepTime -= Time.deltaTime;
         attackTime -= Time.deltaTime;
         Vector3 leftDir = GetMoveDir();
         bool isAttack = GetAttack();
         switch (state)
         {
-            case DemonicState.Idle:
+            case CharacterState.Idle:
                 if (isAttack)
                 {
                     Attack2();
@@ -123,23 +204,23 @@ public class Demonic : MonoBehaviour
                 {
                     if (rb.velocity.y > 0)
                     {
-                        ChangeState(DemonicState.Rise);
+                        ChangeState(CharacterState.Rise);
                         break;
                     }
                     else
                     {
-                        ChangeState(DemonicState.Fall);
+                        ChangeState(CharacterState.Fall);
                         break;
                     }
                 }
                 if (leftDir.x > 0.3f || leftDir.x < -0.3f)
                 {
-                    ChangeState(DemonicState.Walk);
+                    ChangeState(CharacterState.Run);
                     break;
                 }
                 //rb.velocity = Vector3.zero;
                 break;
-            case DemonicState.Walk:
+            case CharacterState.Run:
                 if (isAttack)
                 {
                     Attack2();
@@ -149,18 +230,18 @@ public class Demonic : MonoBehaviour
                 {
                     if (rb.velocity.y > 0)
                     {
-                        ChangeState(DemonicState.Rise);
+                        ChangeState(CharacterState.Rise);
                         break;
                     }
                     else
                     {
-                        ChangeState(DemonicState.Fall);
+                        ChangeState(CharacterState.Fall);
                         break;
                     }
                 }
                 if (leftDir.x < 0.3f && leftDir.x > -0.3f)
                 {
-                    ChangeState(DemonicState.Idle);
+                    ChangeState(CharacterState.Idle);
                     break;
                 }
                 if (leftDir.x > 0.3f)
@@ -190,10 +271,10 @@ public class Demonic : MonoBehaviour
                     }
                 }
                 break;
-            case DemonicState.Rise:
+            case CharacterState.Rise:
                 if (rb.velocity.y <= 0)
                 {
-                    ChangeState(DemonicState.Fall);
+                    ChangeState(CharacterState.Fall);
                     break;
                 }
                 //if (btnJumpPress || cacheJumpTime > 0)
@@ -208,10 +289,10 @@ public class Demonic : MonoBehaviour
                 
                 rb.velocity += Vector3.up * extraRiseGravity * Time.deltaTime;
                 break;
-            case DemonicState.Fall:
+            case CharacterState.Fall:
                 if (foot.TrigGround)
                 {
-                    ChangeState(DemonicState.Idle);
+                    ChangeState(CharacterState.Idle);
                     break;
                 }
                 //if (foot.canStepPlayers.Count > 0)
@@ -242,10 +323,10 @@ public class Demonic : MonoBehaviour
                 //}
                 rb.velocity += Vector3.up * extraFallGravity * Time.deltaTime;
                 break;
-            case DemonicState.Hurt:
+            case CharacterState.Hurt:
                 if (hurtKeepTime <= 0)
                 {
-                    ChangeState(DemonicState.Idle);
+                    ChangeState(CharacterState.Idle);
                     break;
                 }
                 if (!foot.TrigGround)
@@ -254,10 +335,10 @@ public class Demonic : MonoBehaviour
                 }
                 rb.velocity = rb.velocity / 5 * 4;
                 break;
-            case DemonicState.Attack:
+            case CharacterState.Attack:
                 if (attackTime <= 0)
                 {
-                    ChangeState(DemonicState.Idle);
+                    ChangeState(CharacterState.Idle);
                     break;
                 }
                 break;
@@ -281,11 +362,27 @@ public class Demonic : MonoBehaviour
             }
             attackTriggers[i].force = attackDir * attack1Infos[i].force;
         }
-        ChangeState(DemonicState.Attack);
+        ChangeState(CharacterState.Attack);
     }
 
     void Attack2()
     {
+        Vector3 leftDir = GetMoveDir();
+        if (leftDir.x > 0.3f)
+        {
+            if (bodyTrans.localScale.x > 0)
+            {
+                Turn();
+            }
+        }
+        else if (leftDir.x < -0.3f)
+        {
+            if (bodyTrans.localScale.x < 0)
+            {
+                Turn();
+            }
+        }
+
         ani.Play("attack2", 0, 0);
         aniCollider.Play("Attack2", 1, 0);
         attackTime = totalAttack2Time;
@@ -299,66 +396,65 @@ public class Demonic : MonoBehaviour
             }
             attackTriggers[i].force = attackDir * attack2Infos[i].force;
         }
-        ChangeState(DemonicState.Attack);
+        ChangeState(CharacterState.Attack);
     }
 
-    public void ChangeState(DemonicState newState)
+    public override void ChangeState(CharacterState newState)
     {
         switch (state)
         {
-            case DemonicState.Idle:
+            case CharacterState.Idle:
                 break;
-            case DemonicState.Walk:
+            case CharacterState.Run:
                 rb.velocity = Vector3.zero;
                 break;
-            case DemonicState.Rise:
+            case CharacterState.Rise:
                 break;
-            case DemonicState.Fall:
+            case CharacterState.Fall:
                 rb.velocity = Vector3.zero;
                 break;
-            case DemonicState.Hurt:
+            case CharacterState.Hurt:
                 break;
-            case DemonicState.Attack:
+            case CharacterState.Attack:
                 aniCollider.Play("NotAttack", 1, 0);
                 break;
-            case DemonicState.Die:
+            case CharacterState.Die:
                 isDie = false;
                 break;
             default:
                 break;
         }
-        DemonicState oldState = state;
+        CharacterState oldState = state;
         state = newState;
         switch (newState)
         {
-            case DemonicState.Idle:
+            case CharacterState.Idle:
                 ani.Play("idle", 0, 0);
                 aniCollider.Play("Idle", 0, 0);
                 rb.velocity = Vector3.zero;
                 //animalAni.SetInteger("state", (int)PlayerState.Idle);
                 break;
-            case DemonicState.Walk:
+            case CharacterState.Run:
                 ani.Play("walk", 0, 0);
                 aniCollider.Play("Walk", 0, 0);
                 //animalAni.SetInteger("state", (int)PlayerState.Walk);
                 break;
-            case DemonicState.Rise:
+            case CharacterState.Rise:
                 aniCollider.Play("Rise", 0, 0);
                 break;
-            case DemonicState.Fall:
+            case CharacterState.Fall:
                 aniCollider.Play("Fall", 0, 0);
                 //animalAni.SetInteger("state", (int)PlayerState.Fall);
                 break;
-            case DemonicState.Hurt:
+            case CharacterState.Hurt:
                 ani.Play("hitted", 0, 0);
                 aniCollider.Play("Hurt", 0, 0);
                 hurtKeepTime = totalHurtKeepTime;
-                invincibleTime = totalInvincibleTime;
                 //ani.Play("Invincible", 2, 0);
                 break;
-            case DemonicState.Attack:
+            case CharacterState.Attack:
                 break;
-            case DemonicState.Die:
+            case CharacterState.Die:
                 ani.Play("die", 0, 0);
                 aniCollider.Play("Die", 0, 0);
                 isDie = true;
@@ -368,18 +464,8 @@ public class Demonic : MonoBehaviour
         }
     }
 
-    public void BeHit(int damage, Vector3 force)
+    public override void BeHit(int damage, Vector3 force)
     {
-        hp -= damage;
-        uiHp.ShowHP(hp, totalHp);
-        rb.AddForce(force);
-        if (hp < 0)
-        {
-            ChangeState(DemonicState.Die);
-        }
-        else
-        {
-            ChangeState(DemonicState.Hurt);
-        }
+        base.BeHit(damage, force);
     }
 }

+ 96 - 276
ActionTowerDefense/Assets/Scripts/Enemy.cs

@@ -4,24 +4,14 @@ using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 
-public enum EnemyState
+public enum TargetType
 {
-    Idle = 0,
-    Walk = 2,
-    Rise = 3,//空中上升
-    Fall = 4,//空中下落
-    Hurt = 5,
-    Attack = 6,
-    Die = 7,
-}
-
-public enum EnemyTargetType
-{
-    All = 0,
+    None = 0,
     Demonic = 1,
-    LowHPDemonic = 2,
-    Tower = 3,
-    Player = 4,
+    Tower = 2,
+    Player = 3,
+    Enemy = 4,
+    EnemyTower = 5,
 }
 
 public enum SearchState
@@ -31,139 +21,85 @@ public enum SearchState
     InAttackScope = 2,//目标在攻击范围内
 }
 
-public class Enemy : MonoBehaviour
+public class Enemy : MoveCharacter
 {
-    public SkeletonMecanim mecanim;
-    public Skeleton skeleton;
-
-    public Animator ani;
-    public Animator aniCollider;
-    public Rigidbody rb;
-    public Foot foot;
-    public Transform bodyTrans;
-    public UIHP uiHp;
     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 List<AttackInfo> attack1Infos, attack2Infos;
-    public List<AttackTrigger> attackTriggers;
+    public List<TargetType> targetTypes;
+    public List<AttackInfo> attack2Infos;
     public float attackDistance;
     public bool canFly = false;
     public bool canHitFly = false;
 
-    public Demonic targetDemonic;
-    public Tower targetTower;
-    public PlayerController targetPlayer;
+    public Character targetCharacter;
 
     private void Awake()
     {
-        if (!mecanim)
-        {
-            mecanim = GetComponentInChildren<SkeletonMecanim>();
-            skeleton = mecanim.skeleton;
-        }
-        if (!ani)
-        {
-            ani = GetComponentInChildren<Animator>();
-        }
+        Init();
         Debug.Log("测试");
-        BeCreate(100);
+        totalHp = 100;
+        Reload();
     }
 
-    private void FixedUpdate()
+    public override void Init()
     {
-        OnSearchState();
-        OnState();
+        base.Init();
     }
 
-    public void Turn()
+    public override void Reload()
     {
-        bodyTrans.localScale = new Vector3(-bodyTrans.localScale.x, bodyTrans.localScale.y, bodyTrans.localScale.z);
+        base.Reload();
+        ChangeSearchState(SearchState.NoTarget);
+    }
+
+    public override void FixedUpdate()
+    {
+        OnSearchState();
+        OnState();
     }
 
     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)
+                if (targetCharacter)
                 {
-                    moveDir = Vector3.zero;
-                }
-                else if (targetTrans.position.x - transform.position.x < 0)
-                {
-                    moveDir = Vector3.left;
+                    if (targetCharacter.transform.position.x - transform.position.x < 0)
+                    {
+                        moveDir = Vector3.left;
+                    }
+                    else
+                    {
+                        moveDir = Vector3.right;
+                    }
                 }
                 else
                 {
-                    moveDir = Vector3.right;
+                    moveDir = Vector3.zero;
                 }
                 break;
             case SearchState.InAttackScope:
-                targetTrans = null;
-                if (targetDemonic)
-                {
-                    targetTrans = targetDemonic.transform;
-                }
-                else if (targetTower)
-                {
-                    targetTrans = targetTower.transform;
-                }
-                else if (targetPlayer)
+                if (targetCharacter)
                 {
-                    targetTrans = targetPlayer.transform;
-                }
-                if (!targetTrans)
-                {
-                    moveDir = Vector3.zero;
-                }
-                else if (targetTrans.position.x - transform.position.x < 0)
-                {
-                    moveDir = Vector3.left;
+                    if (targetCharacter.transform.position.x - transform.position.x < 0)
+                    {
+                        moveDir = Vector3.left;
+                    }
+                    else
+                    {
+                        moveDir = Vector3.right;
+                    }
                 }
                 else
                 {
-                    moveDir = Vector3.right;
+                    moveDir = Vector3.zero;
                 }
                 break;
             default:
@@ -186,15 +122,16 @@ public class Enemy : MonoBehaviour
         return false;
     }
 
-    public void OnState()
+    public override void OnState()
     {
+        base.OnState();
         hurtKeepTime -= Time.deltaTime;
         attackTime -= Time.deltaTime;
         Vector3 leftDir = GetMoveDir();
         bool isAttack = GetAttack();
         switch (state)
         {
-            case EnemyState.Idle:
+            case CharacterState.Idle:
                 if (isAttack)
                 {
                     Attack2();
@@ -204,23 +141,23 @@ public class Enemy : MonoBehaviour
                 {
                     if (rb.velocity.y > 0)
                     {
-                        ChangeState(EnemyState.Rise);
+                        ChangeState(CharacterState.Rise);
                         break;
                     }
                     else
                     {
-                        ChangeState(EnemyState.Fall);
+                        ChangeState(CharacterState.Fall);
                         break;
                     }
                 }
                 if (leftDir.x > 0.3f || leftDir.x < -0.3f)
                 {
-                    ChangeState(EnemyState.Walk);
+                    ChangeState(CharacterState.Run);
                     break;
                 }
                 //rb.velocity = Vector3.zero;
                 break;
-            case EnemyState.Walk:
+            case CharacterState.Run:
                 if (isAttack)
                 {
                     Attack2();
@@ -230,18 +167,18 @@ public class Enemy : MonoBehaviour
                 {
                     if (rb.velocity.y > 0)
                     {
-                        ChangeState(EnemyState.Rise);
+                        ChangeState(CharacterState.Rise);
                         break;
                     }
                     else
                     {
-                        ChangeState(EnemyState.Fall);
+                        ChangeState(CharacterState.Fall);
                         break;
                     }
                 }
                 if (leftDir.x < 0.3f && leftDir.x > -0.3f)
                 {
-                    ChangeState(EnemyState.Idle);
+                    ChangeState(CharacterState.Idle);
                     break;
                 }
                 if (leftDir.x > 0.3f)
@@ -271,10 +208,10 @@ public class Enemy : MonoBehaviour
                     }
                 }
                 break;
-            case EnemyState.Rise:
+            case CharacterState.Rise:
                 if (rb.velocity.y <= 0)
                 {
-                    ChangeState(EnemyState.Fall);
+                    ChangeState(CharacterState.Fall);
                     break;
                 }
                 //if (btnJumpPress || cacheJumpTime > 0)
@@ -289,10 +226,10 @@ public class Enemy : MonoBehaviour
                 
                 rb.velocity += Vector3.up * extraRiseGravity * Time.deltaTime;
                 break;
-            case EnemyState.Fall:
+            case CharacterState.Fall:
                 if (foot.TrigGround)
                 {
-                    ChangeState(EnemyState.Idle);
+                    ChangeState(CharacterState.Idle);
                     break;
                 }
                 //if (foot.canStepPlayers.Count > 0)
@@ -323,10 +260,10 @@ public class Enemy : MonoBehaviour
                 //}
                 rb.velocity += Vector3.up * extraFallGravity * Time.deltaTime;
                 break;
-            case EnemyState.Hurt:
+            case CharacterState.Hurt:
                 if (hurtKeepTime <= 0)
                 {
-                    ChangeState(EnemyState.Idle);
+                    ChangeState(CharacterState.Idle);
                     break;
                 }
                 if (!foot.TrigGround)
@@ -335,10 +272,10 @@ public class Enemy : MonoBehaviour
                 }
                 rb.velocity = rb.velocity / 5 * 4;
                 break;
-            case EnemyState.Attack:
+            case CharacterState.Attack:
                 if (attackTime <= 0)
                 {
-                    ChangeState(EnemyState.Idle);
+                    ChangeState(CharacterState.Idle);
                     break;
                 }
                 break;
@@ -347,62 +284,62 @@ public class Enemy : MonoBehaviour
         }
     }
 
-    public void ChangeState(EnemyState newState)
+    public override void ChangeState(CharacterState newState)
     {
         switch (state)
         {
-            case EnemyState.Idle:
+            case CharacterState.Idle:
                 break;
-            case EnemyState.Walk:
+            case CharacterState.Run:
                 rb.velocity = Vector3.zero;
                 break;
-            case EnemyState.Rise:
+            case CharacterState.Rise:
                 break;
-            case EnemyState.Fall:
+            case CharacterState.Fall:
                 rb.velocity = Vector3.zero;
                 break;
-            case EnemyState.Hurt:
+            case CharacterState.Hurt:
                 break;
-            case EnemyState.Attack:
+            case CharacterState.Attack:
                 aniCollider.Play("NotAttack", 1, 0);
                 break;
-            case EnemyState.Die:
+            case CharacterState.Die:
                 isDie = false;
                 break;
             default:
                 break;
         }
-        EnemyState oldState = state;
+        CharacterState oldState = state;
         state = newState;
         switch (newState)
         {
-            case EnemyState.Idle:
+            case CharacterState.Idle:
                 ani.Play("idle", 0, 0);
                 aniCollider.Play("Idle", 0, 0);
                 rb.velocity = Vector3.zero;
                 //animalAni.SetInteger("state", (int)PlayerState.Idle);
                 break;
-            case EnemyState.Walk:
+            case CharacterState.Run:
                 ani.Play("walk", 0, 0);
                 aniCollider.Play("Walk", 0, 0);
                 //animalAni.SetInteger("state", (int)PlayerState.Walk);
                 break;
-            case EnemyState.Rise:
+            case CharacterState.Rise:
                 aniCollider.Play("Rise", 0, 0);
                 break;
-            case EnemyState.Fall:
+            case CharacterState.Fall:
                 aniCollider.Play("Fall", 0, 0);
                 //animalAni.SetInteger("state", (int)PlayerState.Fall);
                 break;
-            case EnemyState.Hurt:
+            case CharacterState.Hurt:
                 ani.Play("hitted", 0, 0);
                 aniCollider.Play("Hurt", 0, 0);
                 hurtKeepTime = totalHurtKeepTime;
                 //ani.Play("Invincible", 2, 0);
                 break;
-            case EnemyState.Attack:
+            case CharacterState.Attack:
                 break;
-            case EnemyState.Die:
+            case CharacterState.Die:
                 ani.Play("die", 0, 0);
                 aniCollider.Play("Die", 0, 0);
                 isDie = true;
@@ -420,7 +357,7 @@ public class Enemy : MonoBehaviour
 
     public void SetUpSpeed(float speed)
     {
-        ChangeState(EnemyState.Rise);
+        ChangeState(CharacterState.Rise);
         Vector3 velocity = rb.velocity;
         Vector3 leftDir = GetMoveDir();
         if (leftDir.x > 0.3f)
@@ -459,9 +396,7 @@ public class Enemy : MonoBehaviour
         switch (searchState)
         {
             case SearchState.NoTarget:
-                targetDemonic = null;
-                targetPlayer = null;
-                targetTower = null;
+                targetCharacter = null;
                 break;
             case SearchState.InSearchScope:
                 break;
@@ -474,85 +409,15 @@ public class Enemy : MonoBehaviour
 
     public bool SearchTarget()
     {
-        Demonic demonic;
-        Tower tower;
-        PlayerController player;
-        float disDemonic, disTower, disPlayer;
-        for (int i = 0; i < targetTypes.Count; i++)
+        targetCharacter = searchTrigger.GetMinDisTarget(targetTypes, canHitFly);
+        if (targetCharacter != null)
         {
-            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 true;
+        }
+        else
+        {
+            return false;
         }
-        return false;
     }
 
     public void OnSearchState()
@@ -570,49 +435,21 @@ public class Enemy : MonoBehaviour
             case SearchState.InSearchScope:
                 if (!SearchTarget())
                 {
-                    targetDemonic = null;
-                    targetTower = null;
-                    targetPlayer = null;
+                    targetCharacter = 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)
+                if (targetCharacter != null && Mathf.Abs(targetCharacter.transform.position.x - transform.position.x) <= attackDistance)
                 {
                     ChangeSearchState(SearchState.InAttackScope);
                     break;
                 }
                 break;
             case SearchState.InAttackScope:
-                if (targetDemonic != null)
+                if (targetCharacter != null)
                 {
-                    if (!targetDemonic.gameObject.activeInHierarchy || targetDemonic.isDie 
-                        || Mathf.Abs(targetDemonic.transform.position.x - transform.position.x) > attackDistance)
-                    {
-                        ChangeSearchState(SearchState.NoTarget);
-                    }
-                }
-                else if (targetTower != null)
-                {
-                    if (!targetTower.gameObject.activeInHierarchy || targetTower.isDie 
-                        ||Mathf.Abs(targetTower.transform.position.x - transform.position.x) > attackDistance)
-                    {
-                        ChangeSearchState(SearchState.NoTarget);
-                    }
-                }
-                else if (targetPlayer != null)
-                {
-                    if (!targetPlayer.gameObject.activeInHierarchy || targetPlayer.isDie
-                        || Mathf.Abs(targetPlayer.transform.position.x - transform.position.x) > attackDistance)
+                    if (!targetCharacter.gameObject.activeInHierarchy || targetCharacter.isDie 
+                        || Mathf.Abs(targetCharacter.transform.position.x - transform.position.x) > attackDistance)
                     {
                         ChangeSearchState(SearchState.NoTarget);
                     }
@@ -627,19 +464,9 @@ public class Enemy : MonoBehaviour
         }
     }
 
-    public void BeHit(int damage, Vector3 force)
+    public override void BeHit(int damage, Vector3 force)
     {
-        hp -= damage;
-        uiHp.ShowHP(hp, totalHp);
-        rb.AddForce(force);
-        if (hp < 0)
-        {
-            ChangeState(EnemyState.Die);
-        }
-        else
-        {
-            ChangeState(EnemyState.Hurt);
-        }
+        base.BeHit(damage, force);
     }
 
     public void Attack1()
@@ -657,7 +484,7 @@ public class Enemy : MonoBehaviour
             }
             attackTriggers[i].force = attackDir * attack1Infos[i].force;
         }
-        ChangeState(EnemyState.Attack);
+        ChangeState(CharacterState.Attack);
     }
 
     void Attack2()
@@ -691,14 +518,7 @@ public class Enemy : MonoBehaviour
             }
             attackTriggers[i].force = attackDir * attack2Infos[i].force;
         }
-        ChangeState(EnemyState.Attack);
+        ChangeState(CharacterState.Attack);
     }
 
-    void BeCreate(int tHp)
-    {
-        totalHp = tHp;
-        hp = totalHp;
-        ChangeState(EnemyState.Idle);
-        ChangeSearchState(SearchState.NoTarget);
-    }
 }

+ 1 - 1
ActionTowerDefense/Assets/Scripts/EnemyTower.cs

@@ -2,7 +2,7 @@ using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 
-public class EnemyTower : MonoBehaviour
+public class EnemyTower : Character
 {
     public bool isDie;
 

+ 16 - 0
ActionTowerDefense/Assets/Scripts/MoveCharacter.cs

@@ -0,0 +1,16 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class MoveCharacter : Character
+{
+    public Foot foot;
+
+    public float extraRiseGravity = 0; //上升时额外重力加速度
+    public float extraFallGravity = -10; //下落时额外重力加速度
+    public float maxMoveSpeed = 5;
+
+    [HideInInspector]
+    public float hurtKeepTime;
+    public float totalHurtKeepTime = 0.5f;
+}

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

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

+ 88 - 132
ActionTowerDefense/Assets/Scripts/PlayerController.cs

@@ -16,44 +16,19 @@ public struct AttackInfo
     public Vector3 attackDir;
     public float force;
 }
-public enum PlayerState
-{
-    None = 0,
-    Idle = 1,
-    Run = 2,
-    Rise = 3,//空中上升
-    Fall = 4,//空中下落
-    Hurt = 5,
-    Attack = 6,
-    Summon = 7,
-    Rush = 8,
-    Die = 9,
-}
-public class PlayerController : MonoBehaviour
-{
-    public SkeletonMecanim mecanim;
-    public Skeleton skeleton;
 
-    public Animator ani;
-    public Animator aniCollider;
-    public Rigidbody rb;
-    public Foot foot;
-    public Transform bodyTrans;
-    public UIHP uiHp;
+public class PlayerController : MoveCharacter
+{
 
     public List<GameObject> demonicPrefabs;
     public List<Vector3> demonicSummonPos;
 
-    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 float rushSpeed = 100;
 
-    public PlayerState state = PlayerState.Idle;
     [HideInInspector]
     public float invincibleTime;
     public float totalInvincibleTime = 2f;
@@ -64,12 +39,6 @@ public class PlayerController : MonoBehaviour
     public float cacheJumpTime; //即将落地时按下跳跃键不会跳跃,手感不好,缓存几帧,在这几帧内落地会立即跳跃;
     public float totalCacheJumpTime = 0.1f;
     [HideInInspector]
-    public float hurtKeepTime;
-    public float totalHurtKeepTime = 0.5f;
-    [HideInInspector]
-    public float attackTime;
-    public float totalAttackTime = 0.5f;
-    [HideInInspector]
     public float summonTime;
     public float totalSummonTime = 0.5f;
     [HideInInspector]
@@ -89,12 +58,6 @@ public class PlayerController : MonoBehaviour
     [HideInInspector]
     public bool airJumped;
 
-    public bool isDie = false;
-    public int totalHp = 100;
-    public int hp;
-    public List<AttackInfo> attack1Infos;
-    public List<AttackTrigger> attackTriggers;
-
     public bool btnJumpPress
     {
         get
@@ -178,18 +141,18 @@ public class PlayerController : MonoBehaviour
 
     private void Awake()
     {
-        if (!mecanim)
-        {
-            mecanim = GetComponentInChildren<SkeletonMecanim>();
-            skeleton = mecanim.skeleton;
-        }
-        if (!ani)
-        {
-            ani = GetComponentInChildren<Animator>();
-        }
-        hp = totalHp;
-        ChangeState(PlayerState.Idle);
-        uiHp.ShowHP(hp, totalHp);
+        Init();
+        Reload();
+    }
+
+    public override void Init()
+    {
+        base.Init();
+    }
+
+    public override void Reload()
+    {
+        base.Reload();
     }
 
     private void Update()
@@ -220,9 +183,9 @@ public class PlayerController : MonoBehaviour
         }
     }
 
-    private void FixedUpdate()
+    public override void FixedUpdate()
     {
-        OnState();
+        base.FixedUpdate();
     }
 
     public void Jump()
@@ -239,7 +202,7 @@ public class PlayerController : MonoBehaviour
 
     public void SetUpSpeed(float speed)
     {
-        ChangeState(PlayerState.Rise);
+        ChangeState(CharacterState.Rise);
         Vector3 velocity = rb.velocity;
         if (leftDir.x > 0.3f)
         {
@@ -260,29 +223,24 @@ public class PlayerController : MonoBehaviour
         //animalAni.SetInteger("state", (int)PlayerState.Rise);
     }
 
-    public void Turn()
-    {
-        bodyTrans.localScale = new Vector3(-bodyTrans.localScale.x, bodyTrans.localScale.y, bodyTrans.localScale.z);
-    }
-
     //角色处于可自由活动状态时的通用切换状态逻辑,如Idle、Run状态,以及别的状态结束时准备回到Idle状态前
-    public bool CheckPlayerChangeState(PlayerState excludeState = PlayerState.None)
+    public bool CheckPlayerChangeState(CharacterState excludeState = CharacterState.None)
     {
         if (!foot.TrigGround)
         {
             if (rb.velocity.y > 0)
             {
-                if (excludeState != PlayerState.Rise)
+                if (excludeState != CharacterState.Rise)
                 {
-                    ChangeState(PlayerState.Rise);
+                    ChangeState(CharacterState.Rise);
                     return true;
                 }
             }
             else
             {
-                if (excludeState != PlayerState.Fall)
+                if (excludeState != CharacterState.Fall)
                 {
-                    ChangeState(PlayerState.Fall);
+                    ChangeState(CharacterState.Fall);
                     return true;
                 }
             }
@@ -292,7 +250,7 @@ public class PlayerController : MonoBehaviour
             airJumped = false;
             if (btnWestPress || cacheAttackTime > 0)
             {
-                if (excludeState != PlayerState.Attack)
+                if (excludeState != CharacterState.Attack)
                 {
                     Attack1();
                     return true;
@@ -300,70 +258,70 @@ public class PlayerController : MonoBehaviour
             }
             if (cacheSummonTime > 0)
             {
-                if (excludeState != PlayerState.Summon)
+                if (excludeState != CharacterState.Summon)
                 {
                     Summon(cacheSummonId);
-                    ChangeState(PlayerState.Summon);
+                    ChangeState(CharacterState.Summon);
                     return true;
                 }
             }
             if (btnNorthPress)
             {
-                if (excludeState != PlayerState.Summon)
+                if (excludeState != CharacterState.Summon)
                 {
                     Summon(0);
-                    ChangeState(PlayerState.Summon);
+                    ChangeState(CharacterState.Summon);
                     return true;
                 }
             }
             if (btnSouthPress)
             {
-                if (excludeState != PlayerState.Summon)
+                if (excludeState != CharacterState.Summon)
                 {
                     Summon(1);
-                    ChangeState(PlayerState.Summon);
+                    ChangeState(CharacterState.Summon);
                     return true;
                 }
             }
             if (btnEastPress)
             {
-                if (excludeState != PlayerState.Summon)
+                if (excludeState != CharacterState.Summon)
                 {
                     Summon(2);
-                    ChangeState(PlayerState.Summon);
+                    ChangeState(CharacterState.Summon);
                     return true;
                 }
             }
             if (btnRushPress || cacheRushTime > 0)
             {
-                if (excludeState != PlayerState.Rush)
+                if (excludeState != CharacterState.Rush)
                 {
-                    ChangeState(PlayerState.Rush);
+                    ChangeState(CharacterState.Rush);
                     return true;
                 }
             }
             if (btnJumpPress || cacheJumpTime > 0)
             {
-                if (excludeState != PlayerState.Rise)
+                if (excludeState != CharacterState.Rise)
                 {
                     Jump();
-                    ChangeState(PlayerState.Rise);
+                    ChangeState(CharacterState.Rise);
                     return true;
                 }
             }
             if (leftDir.x > 0.3f || leftDir.x < -0.3f)
             {
-                if (excludeState != PlayerState.Run)
+                if (excludeState != CharacterState.Run)
                 {
-                    ChangeState(PlayerState.Run);
+                    ChangeState(CharacterState.Run);
                     return true;
                 }
             }
             else
             {
-                if (excludeState != PlayerState.Idle)
+                if (excludeState != CharacterState.Idle)
                 {
-                    ChangeState(PlayerState.Idle);
+                    ChangeState(CharacterState.Idle);
                     return true;
                 }
             }
@@ -385,7 +343,7 @@ public class PlayerController : MonoBehaviour
             }
             attackTriggers[i].force = attackDir * attack1Infos[i].force;
         }
-        ChangeState(PlayerState.Attack);
+        ChangeState(CharacterState.Attack);
     }
 
     public void CachedPlayerInput()
@@ -419,8 +377,9 @@ public class PlayerController : MonoBehaviour
         }
     }
 
-    public void OnState()
+    public override void OnState()
     {
+        base.OnState();
         cacheJumpTime -= Time.deltaTime;
         cacheAttackTime -= Time.deltaTime;
         cacheSummonTime -= Time.deltaTime;
@@ -433,16 +392,16 @@ public class PlayerController : MonoBehaviour
         cacheRushTime -= Time.deltaTime;
         switch (state)
         {
-            case PlayerState.Idle:
-                if (CheckPlayerChangeState(PlayerState.Idle))
+            case CharacterState.Idle:
+                if (CheckPlayerChangeState(CharacterState.Idle))
                 {
                     break;
                 }
                 canJumpTime = leaveGroundCanJumpTime;
                 //rb.velocity = Vector3.zero;
                 break;
-            case PlayerState.Run:
-                if (CheckPlayerChangeState(PlayerState.Run))
+            case CharacterState.Run:
+                if (CheckPlayerChangeState(CharacterState.Run))
                 {
                     break;
                 }
@@ -474,15 +433,15 @@ public class PlayerController : MonoBehaviour
                     }
                 }
                 break;
-            case PlayerState.Rise:
+            case CharacterState.Rise:
                 if (btnRushPress || cacheRushTime > 0)
                 {
-                    ChangeState(PlayerState.Rush);
+                    ChangeState(CharacterState.Rush);
                     break;
                 }
                 if (rb.velocity.y <= 0)
                 {
-                    ChangeState(PlayerState.Fall);
+                    ChangeState(CharacterState.Fall);
                     break;
                 }
                 if (btnJumpPress || cacheJumpTime > 0)
@@ -498,10 +457,10 @@ public class PlayerController : MonoBehaviour
                 rb.velocity += Vector3.up * extraRiseGravity * Time.deltaTime;
                 AirMove();
                 break;
-            case PlayerState.Fall:
+            case CharacterState.Fall:
                 if (btnRushPress || cacheRushTime > 0)
                 {
-                    ChangeState(PlayerState.Rush);
+                    ChangeState(CharacterState.Rush);
                     break;
                 }
                 if (foot.TrigGround)
@@ -541,7 +500,7 @@ public class PlayerController : MonoBehaviour
                 rb.velocity += Vector3.up * extraFallGravity * Time.deltaTime;
                 AirMove();
                 break;
-            case PlayerState.Hurt:
+            case CharacterState.Hurt:
                 if (hurtKeepTime <= 0)
                 {
                     if (CheckPlayerChangeState())
@@ -556,7 +515,7 @@ public class PlayerController : MonoBehaviour
                 }
                 rb.velocity = rb.velocity / 5 * 4;
                 break;
-            case PlayerState.Attack:
+            case CharacterState.Attack:
                 if (attackTime <= 0)
                 {
                     if (CheckPlayerChangeState())
@@ -566,7 +525,7 @@ public class PlayerController : MonoBehaviour
                 }
                 CachedPlayerInput();
                 break;
-            case PlayerState.Summon:
+            case CharacterState.Summon:
                 if (summonTime <= 0)
                 {
                     if (CheckPlayerChangeState())
@@ -576,7 +535,7 @@ public class PlayerController : MonoBehaviour
                 }
                 
                 break;
-            case PlayerState.Rush:
+            case CharacterState.Rush:
                 if (rushTime <= 0)
                 {
                     if (CheckPlayerChangeState())
@@ -605,43 +564,43 @@ public class PlayerController : MonoBehaviour
         isClickBtnWest = false;
     }
 
-    public void ChangeState(PlayerState newState)
+    public override void ChangeState(CharacterState newState)
     {
         switch (state)
         {
-            case PlayerState.Idle:
+            case CharacterState.Idle:
                 break;
-            case PlayerState.Run:
+            case CharacterState.Run:
                 rb.velocity = Vector3.zero;
                 break;
-            case PlayerState.Rise:
+            case CharacterState.Rise:
                 break;
-            case PlayerState.Fall:
+            case CharacterState.Fall:
                 rb.velocity = Vector3.zero;
                 break;
-            case PlayerState.Hurt:
+            case CharacterState.Hurt:
                 break;
-            case PlayerState.Attack:
+            case CharacterState.Attack:
                 aniCollider.Play("NotAttack", 1, 0);
                 break;
-            case PlayerState.Summon:
+            case CharacterState.Summon:
                 break;
-            case PlayerState.Rush:
+            case CharacterState.Rush:
                 rb.velocity = Vector3.zero;
                 break;
-            case PlayerState.Die:
+            case CharacterState.Die:
                 isDie = false;
                 break;
             default:
                 break;
         }
-        PlayerState oldState = state;
+        CharacterState oldState = state;
         state = newState;
         switch (newState)
         {
-            case PlayerState.Idle:
+            case CharacterState.Idle:
                 aniCollider.Play("Idle", 0, 0);
-                if (oldState == PlayerState.Fall)
+                if (oldState == CharacterState.Fall)
                 {
                     ani.Play("fall_end", 0, 0);
                 }
@@ -652,41 +611,41 @@ public class PlayerController : MonoBehaviour
                 rb.velocity = Vector3.zero;
                 //animalAni.SetInteger("state", (int)PlayerState.Idle);
                 break;
-            case PlayerState.Run:
+            case CharacterState.Run:
                 aniCollider.Play("Run", 0, 0);
                 ani.Play("run_start", 0, 0);
                 //animalAni.SetInteger("state", (int)PlayerState.Walk);
                 break;
-            case PlayerState.Rise:
+            case CharacterState.Rise:
                 aniCollider.Play("Rise", 0, 0);
                 canJumpTime = 0;
                 break;
-            case PlayerState.Fall:
+            case CharacterState.Fall:
                 aniCollider.Play("Fall", 0, 0);
                 ani.Play("fall", 0, 0);
                 //animalAni.SetInteger("state", (int)PlayerState.Fall);
                 break;
-            case PlayerState.Hurt:
+            case CharacterState.Hurt:
                 aniCollider.Play("Hurt", 0, 0);
                 ani.Play("hitted", 0, 0);
                 hurtKeepTime = totalHurtKeepTime;
                 invincibleTime = totalInvincibleTime;
                 //ani.Play("Invincible", 2, 0);
                 break;
-            case PlayerState.Attack:
-                attackTime = totalAttackTime;
+            case CharacterState.Attack:
+                attackTime = totalAttack1Time;
                 break;
-            case PlayerState.Summon:
+            case CharacterState.Summon:
                 aniCollider.Play("Summon", 0, 0);
                 ani.Play("summon", 0, 0);
                 summonTime = totalSummonTime;
                 break;
-            case PlayerState.Rush:
+            case CharacterState.Rush:
                 aniCollider.Play("Rush", 0, 0);
                 ani.Play("rush_loop", 0, 0);
                 rushTime = totalRushTime;
                 break;
-            case PlayerState.Die:
+            case CharacterState.Die:
                 aniCollider.Play("Die", 0, 0);
                 ani.Play("die", 0, 0);
                 isDie = true;
@@ -747,33 +706,30 @@ public class PlayerController : MonoBehaviour
         Demonic demonic = demonicObj.GetComponent<Demonic>();
         demonicObj.transform.parent = null;
         demonicObj.transform.localEulerAngles = Vector3.zero;
+        demonicObj.transform.localScale = new Vector3(1, 1, 1);
         Vector3 offset = demonicSummonPos[id];
         if (bodyTrans.localScale.x > 0)
         {
             demonicObj.transform.position = transform.position + offset;
-            demonicObj.transform.localScale = new Vector3(1, 1, 1);
+            if (demonic.bodyTrans.localScale.x < 0)
+            {
+                Turn();
+            }
         }
         else
         {
             demonicObj.transform.position = transform.position + new Vector3(-offset.x, offset.y, offset.z);
-            demonicObj.transform.localScale = new Vector3(-1, 1, 1);
+            if (demonic.bodyTrans.localScale.x < 0)
+            {
+                Turn();
+            }
         }
         demonic.BeSummon(100);
         demonic.Attack1();
     }
 
-    public void BeHit(int damage, Vector3 force)
+    public override void BeHit(int damage, Vector3 force)
     {
-        hp -= damage;
-        uiHp.ShowHP(hp, totalHp);
-        rb.AddForce(force);
-        if (hp < 0)
-        {
-            ChangeState(PlayerState.Die);
-        }
-        else
-        {
-            ChangeState(PlayerState.Hurt);
-        }
+        base.BeHit(damage, force);
     }
 }

+ 51 - 168
ActionTowerDefense/Assets/Scripts/SearchTrigger.cs

@@ -1,35 +1,18 @@
 using System.Collections;
 using System.Collections.Generic;
+using System.Net;
 using UnityEngine;
+using UnityEngine.TextCore.Text;
 
 public class SearchTrigger : MonoBehaviour
 {
-    public GameObject owner;
+    public Character owner;
 
     public List<BeSearchTrigger> trigObjList;
 
     private void Awake()
     {
-        if (GetComponentInParent<PlayerController>())
-        {
-            owner = GetComponentInParent<PlayerController>().gameObject;
-        }
-        else if (GetComponentInParent<Demonic>())
-        {
-            owner = GetComponentInParent<Demonic>().gameObject;
-        }
-        else if (GetComponentInParent<Tower>())
-        {
-            owner = GetComponentInParent<Tower>().gameObject;
-        }
-        else if (GetComponentInParent<Enemy>())
-        {
-            owner = GetComponentInParent<Enemy>().gameObject;
-        }
-        else if (GetComponentInParent<EnemyTower>())
-        {
-            owner = GetComponentInParent<EnemyTower>().gameObject;
-        }
+        owner = GetComponentInParent<Character>();
     }
 
     private void FixedUpdate()
@@ -60,193 +43,93 @@ public class SearchTrigger : MonoBehaviour
         }
     }
 
-    public Demonic GetMinDisDemonic(bool canHitFly, out float dis)
+    public bool HasTargetType(List<TargetType> targetTypes, TargetType targetType)
     {
-        Demonic minDisDemonic = null;
-        dis = 99999;
-        for (int i = 0; i < trigObjList.Count; i++)
+        for (int i = 0; i < targetTypes.Count; i++)
         {
-            if (trigObjList[i].owner.tag == "Demonic")
+            if (targetTypes[i] == targetType)
             {
-                Demonic demonic = trigObjList[i].GetComponentInParent<Demonic>();
-                if (!demonic.gameObject.activeInHierarchy || demonic.isDie)
-                {
-                    continue;
-                }
-                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 true;
             }
         }
-        return minDisDemonic;
+        return false;
     }
 
-    public Demonic GetMinHPDemonic(bool canHitFly)
+    public List<Character> GetAllTargets(List<TargetType> targetTypes, bool canHitFly)
     {
-        Demonic minHPDemonic = null;
+        List<Character> list = new List<Character>();
         for (int i = 0; i < trigObjList.Count; i++)
         {
-            if (trigObjList[i].owner.tag == "Demonic")
+            if (trigObjList[i].owner.tag == "Demonic" && HasTargetType(targetTypes, TargetType.Demonic)
+                || trigObjList[i].owner.tag == "Tower" && HasTargetType(targetTypes, TargetType.Tower)
+                || trigObjList[i].owner.tag == "Player" && HasTargetType(targetTypes, TargetType.Player)
+                || trigObjList[i].owner.tag == "Enemy" && HasTargetType(targetTypes, TargetType.Enemy)
+                || trigObjList[i].owner.tag == "EnemyTower" && HasTargetType(targetTypes, TargetType.EnemyTower))
             {
-                Demonic demonic = trigObjList[i].GetComponentInParent<Demonic>();
-                if (!demonic.gameObject.activeInHierarchy || demonic.isDie)
+                Character character = trigObjList[i].owner;
+                if (!character.gameObject.activeInHierarchy || character.isDie)
                 {
                     continue;
                 }
-                if (owner.tag == "Demonic" && owner.GetComponent<Demonic>() == demonic)
+                if (owner == character)
                 {
                     continue;
                 }
-                if (demonic.canFly && !canHitFly)
+                if (trigObjList[i].owner.tag == "Demonic")
                 {
-                    continue;
+                    Demonic demonic = trigObjList[i].owner as Demonic;
+                    if (demonic.canFly && !canHitFly)
+                    {
+                        continue;
+                    }
                 }
-                if (minHPDemonic == null || minHPDemonic.hp > demonic.hp)
+                if (trigObjList[i].owner.tag == "Enemy")
                 {
-                    minHPDemonic = demonic;
+                    Enemy enemy = trigObjList[i].owner as Enemy;
+                    if (enemy.canFly && !canHitFly)
+                    {
+                        continue;
+                    }
                 }
             }
-        }
-        return minHPDemonic;
-    }
-
-    public Tower GetMinDisTower(out float dis)
-    {
-        Tower minDisTower = null;
-        dis = 99999;
-        for (int i = 0; i < trigObjList.Count; i++)
-        {
-            if (trigObjList[i].owner.tag == "Tower")
+            else
             {
-                Tower tower = trigObjList[i].GetComponentInParent<Tower>();
-                if (!tower.gameObject.activeInHierarchy || tower.isDie)
-                {
-                    continue;
-                }
-                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);
-                }
+                continue;
             }
+            list.Add(trigObjList[i].owner);
         }
-        return minDisTower;
+        return list;
     }
 
-    public PlayerController GetPlayer(out float dis)
+    public Character GetMinDisTarget(List<TargetType> targetTypes, bool canHitFly)
     {
-        dis = 99999;
-        for (int i = 0; i < trigObjList.Count; i++)
-        {
-            if (trigObjList[i].owner.tag == "Player")
-            {
-                PlayerController player = trigObjList[i].GetComponentInParent<PlayerController>();
-                if (!player.gameObject.activeInHierarchy || player.isDie)
-                {
-                    continue;
-                }
-                dis = Mathf.Abs(player.transform.position.x - owner.transform.position.x);
-                return player;
-            }
-        }
-        return null;
-    }
-
+        List<Character> list = GetAllTargets(targetTypes, canHitFly);
 
-    public Enemy GetMinDisEnemy(bool canHitFly)
-    {
-        Enemy minDisEnemy = null;
-        for (int i = 0; i < trigObjList.Count; i++)
+        Character minDisChar = null;
+        for (int i = 0; i < list.Count; i++)
         {
-            if (trigObjList[i].owner.tag == "Enemy")
+            Character character = list[i];
+            if (minDisChar == null || Mathf.Abs(minDisChar.transform.position.x - owner.transform.position.x) > Mathf.Abs(character.transform.position.x - owner.transform.position.x))
             {
-                Enemy enemy = trigObjList[i].GetComponentInParent<Enemy>();
-                if (!enemy.gameObject.activeInHierarchy || enemy.isDie)
-                {
-                    continue;
-                }
-                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;
-                }
+                minDisChar = character;
             }
         }
-        return minDisEnemy;
+        return minDisChar;
     }
 
-    public Enemy GetMinHPEnemy(bool canHitFly)
+    public Character GetMinHPCharacter(List<TargetType> targetTypes, bool canHitFly)
     {
-        Enemy minHPEnemy = null;
-        for (int i = 0; i < trigObjList.Count; i++)
-        {
-            if (trigObjList[i].owner.tag == "Enemy")
-            {
-                Enemy enemy = trigObjList[i].GetComponentInParent<Enemy>();
-                if (!enemy.gameObject.activeInHierarchy || enemy.isDie)
-                {
-                    continue;
-                }
-                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;
-    }
+        List<Character> list = GetAllTargets(targetTypes, canHitFly);
 
-    public EnemyTower GetMinDisEnemyTower()
-    {
-        EnemyTower minDisEnemyTower = null;
-        for (int i = 0; i < trigObjList.Count; i++)
+        Character minHPChar = null;
+        for (int i = 0; i < list.Count; i++)
         {
-            if (trigObjList[i].owner.tag == "EnemyTower")
+            Character character = list[i];
+            if (minHPChar == null || minHPChar.hp > character.hp)
             {
-                EnemyTower enemyTower = trigObjList[i].GetComponentInParent<EnemyTower>();
-                if (!enemyTower.gameObject.activeInHierarchy || enemyTower.isDie)
-                {
-                    continue;
-                }
-                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;
-                }
+                minHPChar = character;
             }
         }
-        return minDisEnemyTower;
+        return minHPChar;
     }
 }

+ 1 - 1
ActionTowerDefense/Assets/Scripts/Tower.cs

@@ -2,7 +2,7 @@ using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 
-public class Tower : MonoBehaviour
+public class Tower : Character
 {
     public bool isDie;