WavePowerSkill.cs 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class WavePowerSkill : MonoBehaviour
  5. {
  6. public enum mode
  7. {
  8. knockUp, //击飞
  9. single, //单体
  10. all, //群体
  11. }
  12. public int cacheID;
  13. public PlayerController pc;
  14. private float curX;
  15. [Header("当前模式")]
  16. public mode curMode;
  17. [Header("推出去的过程")]
  18. public float maxLength;
  19. private float curLength;
  20. public float longSpeed;
  21. public int longFX;
  22. [Header("推力、伤害")]
  23. public float maxForceX;
  24. public float minForceX;
  25. public float maxForceY;
  26. public float minForceY;
  27. private int fx = 1;
  28. private Vector3 curForce;
  29. public int damage;
  30. [Header("时间")]
  31. public float singleTime;
  32. public float continueTime;
  33. public float hitIntervalTime;
  34. private float curHitTime;
  35. public float moreComaTime;
  36. [Header("受控目标")]
  37. public List<Enemy> targetEnes = new List<Enemy>();
  38. public Enemy singleTarget;
  39. public float curMinDis;
  40. private void Start()
  41. {
  42. curX = transform.localScale.x;
  43. }
  44. private void Update()
  45. {
  46. if (pc.isDie)
  47. {
  48. ActiveFalse();
  49. }
  50. if (curLength < maxLength)
  51. {
  52. curLength += longSpeed * Time.deltaTime;
  53. transform.localScale = new Vector3(curX, curLength * longFX, 1);
  54. }
  55. else
  56. {
  57. continueTime -= Time.deltaTime;
  58. if (continueTime <= 0)
  59. {
  60. ActiveFalse();
  61. }
  62. }
  63. AttackMode();
  64. }
  65. public void ActiveFalse()
  66. {
  67. pc.conductCanRelease[cacheID] = true;
  68. pc.canMove = true;
  69. pc.rb.constraints = RigidbodyConstraints.FreezeRotation | RigidbodyConstraints.FreezePositionZ;
  70. pc.rb.useGravity = true;
  71. gameObject.SetActive(false);
  72. }
  73. private void AttackMode()
  74. {
  75. switch (curMode)
  76. {
  77. case mode.knockUp:
  78. break;
  79. case mode.single:
  80. List<Enemy> dieEne = new List<Enemy>();
  81. foreach(Enemy ene in targetEnes)
  82. {
  83. if (ene.isDie)
  84. {
  85. dieEne.Add(ene);
  86. if (ene == singleTarget)
  87. {
  88. singleTarget = null;
  89. }
  90. continue;
  91. }
  92. float dis = Mathf.Abs(ene.bodyTrans.position.x - transform.position.x);
  93. if (singleTarget == null)
  94. {
  95. curMinDis = dis;
  96. singleTarget = ene;
  97. }
  98. else if (dis < curMinDis)
  99. {
  100. //singleTarget.ChangeState(CharacterState.Idle);
  101. curMinDis = dis;
  102. transform.localScale = new Vector3(curX, curMinDis * longFX, 1);
  103. singleTarget = ene;
  104. }
  105. }
  106. foreach(Enemy ene in dieEne)
  107. {
  108. targetEnes.Remove(ene);
  109. }
  110. if (singleTarget)
  111. {
  112. if (singleTarget.isDie)
  113. {
  114. singleTarget = null;
  115. }
  116. else
  117. {
  118. singleTarget.comaTime = continueTime + moreComaTime;
  119. singleTarget.ChangeState(CharacterState.Coma);
  120. singleTarget.transform.position -= new Vector3(longFX * longSpeed * Time.deltaTime, 0, 0);
  121. curHitTime += Time.deltaTime;
  122. if (curHitTime >= hitIntervalTime)
  123. {
  124. curHitTime = 0;
  125. singleTarget.BeHit(damage, Vector3.zero, false, 0);
  126. }
  127. curMinDis += longSpeed * Time.deltaTime;
  128. }
  129. }
  130. break;
  131. case mode.all:
  132. foreach (Enemy ene in targetEnes)
  133. {
  134. if (!ene.isDie)
  135. {
  136. ene.comaTime = continueTime + moreComaTime;
  137. ene.ChangeState(CharacterState.Coma);
  138. ene.transform.position -= new Vector3(longSpeed * Time.deltaTime, 0, 0);
  139. curHitTime += Time.deltaTime;
  140. if (curHitTime >= hitIntervalTime)
  141. {
  142. curHitTime = 0;
  143. ene.BeHit(damage, Vector3.zero, false, 0);
  144. }
  145. }
  146. }
  147. break;
  148. default:
  149. break;
  150. }
  151. }
  152. private void OnTriggerEnter(Collider other)
  153. {
  154. BeHitTrigger beHitTrigger = other.GetComponent<BeHitTrigger>();
  155. if (beHitTrigger && beHitTrigger.owner.tag == "Enemy")
  156. {
  157. Enemy ene = other.GetComponentInParent<Enemy>();
  158. if (ene.isDie)
  159. {
  160. return;
  161. }
  162. switch (curMode)
  163. {
  164. case mode.knockUp:
  165. fx = (int)((Random.Range(0, 2) - 0.5f) * 2);
  166. curForce = new Vector3(Random.Range(minForceX, maxForceX), Random.Range(minForceY, maxForceY), 0);
  167. curForce.x *= fx;
  168. //ene.ChangeState(CharacterState.Weak);
  169. ene.wallDamage = damage;
  170. ene.rb.AddForce(curForce);
  171. break;
  172. case mode.single:
  173. targetEnes.Add(ene);
  174. break;
  175. case mode.all:
  176. targetEnes.Add(ene);
  177. break;
  178. default:
  179. break;
  180. }
  181. }
  182. }
  183. private void OnTriggerExit(Collider other)
  184. {
  185. BeHitTrigger beHitTrigger = other.GetComponent<BeHitTrigger>();
  186. if (beHitTrigger && beHitTrigger.owner.tag == "Enemy")
  187. {
  188. Enemy ene = other.GetComponentInParent<Enemy>();
  189. targetEnes.Remove(ene);
  190. //ene.ChangeState(CharacterState.Weak);
  191. ene.weakTime = moreComaTime;
  192. //ene.ChangeState(CharacterState.Idle);
  193. }
  194. }
  195. }