HairSprint.cs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using Sirenix.OdinInspector;
  5. using System.Linq;
  6. public class HairSprint : MonoBehaviour
  7. {
  8. public enum HairState
  9. {
  10. none,
  11. SearchAim,
  12. Chua,
  13. }
  14. [DisplayOnly]
  15. public HairState hairState;
  16. [LabelText("总攻击次数")]
  17. public int attackTime;
  18. private int curTime;
  19. [LabelText("伤害值")]
  20. public int damage;
  21. [LabelText("头发预制体")]
  22. public GameObject hairPre;
  23. [LabelText("预警预制体")]
  24. public GameObject warningPre;
  25. private GameObject[] hairIns;
  26. private GameObject[] warningIns;
  27. //生成到第几根头发了
  28. private int curHairID;
  29. [DisplayOnly]
  30. [LabelText("目标坐标")]
  31. public Vector3[] aims;
  32. private bool hasFoundAllAims;
  33. [HideInInspector]
  34. public WaterSprite ws;
  35. [DisplayOnly]
  36. public Character[] aimChas;
  37. [Header("动画时长")]
  38. [LabelText("预警时长")]
  39. public float warningTime;
  40. [LabelText("存在时长")]
  41. public float existTime;
  42. private float pastTime;
  43. [LabelText("找目标时长")]
  44. public float searchTime;
  45. [LabelText("单个攻击动画时长")]
  46. public float singleChuaTime;
  47. public void Release(int _attackTime)
  48. {
  49. if (hairIns == null)
  50. {
  51. hairIns = new GameObject[attackTime];
  52. warningIns = new GameObject[attackTime];
  53. }
  54. attackTime = _attackTime;
  55. gameObject.SetActive(true);
  56. curHairID = 0;
  57. ChangeHairState(HairState.SearchAim);
  58. }
  59. private void ChangeHairState(HairState hs)
  60. {
  61. if (hairState == hs)
  62. {
  63. return;
  64. }
  65. hairState = hs;
  66. switch (hs)
  67. {
  68. case HairState.SearchAim:
  69. aimChas = new Character[attackTime];
  70. GetAims();
  71. break;
  72. case HairState.Chua:
  73. curTime = 0;
  74. for(int i = 0; i < attackTime; i++)
  75. {
  76. if (hairIns[i] == null)
  77. {
  78. //预警实例生成
  79. warningIns[i] = Instantiate(warningPre);
  80. warningIns[i].SetActive(false);
  81. //头发实例生成
  82. hairIns[i] = Instantiate(hairPre);
  83. hairIns[i].SetActive(false);
  84. SingleHairAttack sha = hairIns[i].GetComponent<SingleHairAttack>();
  85. sha.existTime = existTime;
  86. sha.attackTime = attackTime;
  87. sha.damage = damage;
  88. }
  89. }
  90. Chua(0);
  91. break;
  92. }
  93. }
  94. private void GetAims()
  95. {
  96. aims = new Vector3[attackTime];
  97. List<Character> aimCharacters = new List<Character>();
  98. aimCharacters = ws.searchTrigger.GetAllTargets(ws.attackController.targetTypes, true);
  99. bool hasAimedPlayer = false;
  100. var sortedObjects = aimCharacters.OrderBy(obj => Vector3.Distance(transform.position, obj.transform.position)).ToArray();
  101. if (sortedObjects.Length > attackTime)
  102. {
  103. for(int i = 0; i < attackTime - 1; i++)
  104. {
  105. aimChas[i] = sortedObjects[i];
  106. if (sortedObjects[i].gameObject.layer == 6)
  107. {
  108. hasAimedPlayer = true;
  109. }
  110. aims[i] = sortedObjects[i].bodyTrans.position;
  111. }
  112. if (hasAimedPlayer)
  113. {
  114. aims[attackTime - 1] = sortedObjects[attackTime - 1].bodyTrans.position;
  115. }
  116. else
  117. {
  118. aims[attackTime - 1] = PlayersInput.instance[0].bodyTrans.position;
  119. }
  120. }
  121. else
  122. {
  123. int id = 0;
  124. foreach(Character c in aimCharacters)
  125. {
  126. aims[id] = c.bodyTrans.position;
  127. id++;
  128. }
  129. Vector3 v = PlayersInput.instance[0].bodyTrans.position;
  130. for(int i = id; i < attackTime; i++)
  131. {
  132. aims[i] = v;
  133. }
  134. }
  135. hasFoundAllAims = true;
  136. }
  137. private void Chua(int id)
  138. {
  139. //警示线出现
  140. warningIns[id].transform.position = aims[id];
  141. float ro = Random.Range(0, 360);
  142. warningIns[id].transform.localEulerAngles = new Vector3(0, 0, ro);
  143. warningIns[id].SetActive(true);
  144. hairIns[id].transform.position = aims[id];
  145. hairIns[id].transform.localEulerAngles = warningIns[id].transform.localEulerAngles;
  146. //头发出来
  147. Invoke("HairOut", warningTime);
  148. }
  149. private void HairOut()
  150. {
  151. int id = curHairID;
  152. hairIns[id].SetActive(true);
  153. warningIns[id].SetActive(false);
  154. curHairID++;
  155. if (curHairID == attackTime)
  156. {
  157. gameObject.SetActive(false);
  158. }
  159. }
  160. private void OnHairState()
  161. {
  162. pastTime += Time.deltaTime;
  163. switch (hairState)
  164. {
  165. case HairState.SearchAim:
  166. if (pastTime >= searchTime && hasFoundAllAims)
  167. {
  168. pastTime = 0;
  169. ChangeHairState(HairState.Chua);
  170. }
  171. break;
  172. case HairState.Chua:
  173. if (curTime < attackTime)
  174. {
  175. pastTime += Time.deltaTime;
  176. if (pastTime >= singleChuaTime)
  177. {
  178. pastTime = 0;
  179. curTime++;
  180. if (curTime != attackTime)
  181. {
  182. Chua(curTime);
  183. }
  184. }
  185. }
  186. else
  187. {
  188. ChangeHairState(HairState.none);
  189. ws.EndCurAttackState(true);
  190. }
  191. break;
  192. }
  193. }
  194. private void Update()
  195. {
  196. OnHairState();
  197. }
  198. }