EnemyTower.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  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. attackTarget = null;
  82. break;
  83. case CharacterState.Die:
  84. isDie = false;
  85. break;
  86. default:
  87. break;
  88. }
  89. CharacterState oldState = state;
  90. state = newState;
  91. switch (newState)
  92. {
  93. case CharacterState.Idle:
  94. //ani.Play("idle", 0, 0);
  95. rb.velocity = Vector3.zero;
  96. //animalAni.SetInteger("state", (int)PlayerState.Idle);
  97. break;
  98. case CharacterState.Attack:
  99. attackTarget = targetCharacter;
  100. if ((attackTarget.transform.position - transform.position).x > 0
  101. && bodyTrans.localScale.x > 0)
  102. {
  103. Turn();
  104. }
  105. else if ((attackTarget.transform.position - transform.position).x < 0
  106. && bodyTrans.localScale.x < 0)
  107. {
  108. Turn();
  109. }
  110. break;
  111. case CharacterState.Die:
  112. ani.Play("die", 0, 0);
  113. isDie = true;
  114. dieKeepTime = totalDieKeepTime;
  115. TowerMap.myTowers.Remove(gameObject);
  116. break;
  117. default:
  118. break;
  119. }
  120. }
  121. public override void BeHit(int damage, Vector3 force, bool changeHurt, float repelValue)
  122. {
  123. hp -= damage;
  124. //伤害跳字
  125. if (showInjuryNum)
  126. {
  127. GameObject injuryNum = Instantiate(injuryNumText);
  128. injuryNum.transform.position = new Vector3(transform.position.x + Random.Range(-1f, 1f), transform.position.y + 1, transform.position.z);
  129. TextMeshProUGUI text = injuryNum.GetComponentInChildren<TextMeshProUGUI>();
  130. text.text = damage.ToString();
  131. if (gameObject.CompareTag("Player"))
  132. {
  133. text.color = Color.red;
  134. }
  135. }
  136. uiHp.Show(hp, totalHp);
  137. if (hp <= 0)
  138. {
  139. ChangeState(CharacterState.Die);
  140. }
  141. }
  142. }