EnemyTower.cs 4.5 KB

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