EnemyTower.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using TMPro;
  5. public class EnemyTower : Character
  6. {
  7. public int id;
  8. public float height = 8;
  9. public bool haveDisappearTime; //有消失时间
  10. public float disappearTime; //消失时间
  11. private void Awake()
  12. {
  13. TowerMap.enemyTowers.Add(gameObject);
  14. Init();
  15. }
  16. private void Update()
  17. {
  18. if (haveDisappearTime)
  19. {
  20. disappearTime -= Time.deltaTime;
  21. if(state!=CharacterState.Die && disappearTime < 0)
  22. {
  23. ChangeState(CharacterState.Die);
  24. }
  25. }
  26. }
  27. public bool GetAttack()
  28. {
  29. if (targetCharacter != null)
  30. {
  31. return true;
  32. }
  33. return false;
  34. }
  35. public void SearchTarget()
  36. {
  37. targetCharacter = searchTrigger.GetMinDisTarget(targetTypes, true);
  38. }
  39. public override void OnState()
  40. {
  41. base.OnState();
  42. SearchTarget();
  43. attackTime -= Time.deltaTime;
  44. dieKeepTime -= Time.deltaTime;
  45. bool isAttack = GetAttack();
  46. switch (state)
  47. {
  48. case CharacterState.Idle:
  49. if (isAttack)
  50. {
  51. Attack_summon();
  52. break;
  53. }
  54. break;
  55. case CharacterState.Attack:
  56. if (attackTime <= 0)
  57. {
  58. ChangeState(CharacterState.Idle);
  59. break;
  60. }
  61. break;
  62. case CharacterState.Die:
  63. if (dieKeepTime <= 0)
  64. {
  65. TowerMap.enemyTowers.Remove(gameObject);
  66. gameObject.SetActive(false);
  67. break;
  68. }
  69. break;
  70. default:
  71. break;
  72. }
  73. }
  74. public override void ChangeState(CharacterState newState)
  75. {
  76. switch (state)
  77. {
  78. case CharacterState.Idle:
  79. break;
  80. case CharacterState.Attack:
  81. aniCollider.Play("NotAttack", 1, 0);
  82. attackTarget = null;
  83. break;
  84. case CharacterState.Die:
  85. isDie = false;
  86. break;
  87. default:
  88. break;
  89. }
  90. CharacterState oldState = state;
  91. state = newState;
  92. switch (newState)
  93. {
  94. case CharacterState.Idle:
  95. //ani.Play("idle", 0, 0);
  96. aniCollider.Play("Idle", 0, 0);
  97. rb.velocity = Vector3.zero;
  98. //animalAni.SetInteger("state", (int)PlayerState.Idle);
  99. break;
  100. case CharacterState.Attack:
  101. attackTarget = targetCharacter;
  102. if ((attackTarget.transform.position - transform.position).x > 0
  103. && bodyTrans.localScale.x > 0)
  104. {
  105. Turn();
  106. }
  107. else if ((attackTarget.transform.position - transform.position).x < 0
  108. && bodyTrans.localScale.x < 0)
  109. {
  110. Turn();
  111. }
  112. break;
  113. case CharacterState.Die:
  114. ani.Play("die", 0, 0);
  115. aniCollider.Play("Die", 0, 0);
  116. isDie = true;
  117. dieKeepTime = totalDieKeepTime;
  118. TowerMap.myTowers.Remove(gameObject);
  119. break;
  120. default:
  121. break;
  122. }
  123. }
  124. public override void BeHit(int damage, Vector3 force, bool changeHurt, float repelValue)
  125. {
  126. hp -= damage;
  127. //伤害跳字
  128. if (showInjuryNum)
  129. {
  130. GameObject injuryNum = Instantiate(injuryNumText);
  131. injuryNum.transform.position = new Vector3(transform.position.x + Random.Range(-1f, 1f), transform.position.y + 1, transform.position.z);
  132. TextMeshProUGUI text = injuryNum.GetComponentInChildren<TextMeshProUGUI>();
  133. text.text = damage.ToString();
  134. if (gameObject.CompareTag("Player"))
  135. {
  136. text.color = Color.red;
  137. }
  138. }
  139. uiHp.Show(hp, totalHp);
  140. if (hp <= 0)
  141. {
  142. ChangeState(CharacterState.Die);
  143. }
  144. }
  145. }