ESpirits_Float.cs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class ESpirits_Float : MonoBehaviour
  5. {
  6. [Header("出场飞升")]
  7. private bool isRise = true;
  8. public float maxHeight, minHeight;
  9. private float height; //升到哪个高度后停止
  10. private float curHeight;
  11. private float speed = 1;
  12. private Vector3 origPos;
  13. [Header("漂浮锁定玩家")]
  14. public float intervalTime = 10f; //漂浮间隔时间
  15. public float firstAttackTime = 2f; //第一次攻击距出场的时间
  16. private Vector3 attackPos; //漂浮中心
  17. public float followTime = 3; //跟随玩家时间
  18. public float lockTime = 1.5f; //锁定等待时间
  19. //public float attackTime = 10f; //漂浮持续时间
  20. public GameObject fe; //漂浮脚本
  21. public GameObject lockEffect; //锁定特效
  22. private GameObject curFe;
  23. private GameObject curLock;
  24. private float pastTime; //已经经过的时间
  25. private PlayerController player1;
  26. private PlayerController player2;
  27. private GameObject target;
  28. private bool isDoing = false;
  29. private bool isFollow = false;
  30. private bool isOn = false;
  31. private bool isLock = false;
  32. private bool isAttack = false;
  33. private Enemy ene;
  34. private void Awake()
  35. {
  36. ene = GetComponent<Enemy>();
  37. curLock = PoolManager.Instantiate(lockEffect, new Vector3(0, -50, 0), new Quaternion(0, 0, 0, 0), null);
  38. curFe = PoolManager.Instantiate(fe, curLock.transform.position, new Quaternion(0, 0, 0, 0), null);
  39. curFe.GetComponent<FloatEffect>().isEnemy = true;
  40. curFe.GetComponent<FloatEffect>().ene = ene;
  41. curFe.SetActive(false);
  42. curLock.SetActive(false);
  43. player1 = PlayersInput.instance[0];
  44. player2 = PlayersInput.instance[1];
  45. }
  46. private void Start()
  47. {
  48. origPos = transform.position;
  49. curHeight = origPos.y;
  50. pastTime = intervalTime - firstAttackTime;
  51. height = Random.Range(minHeight, maxHeight);
  52. curFe.SetActive(true);
  53. }
  54. private void OnDisable()
  55. {
  56. if (curFe != null)
  57. {
  58. curFe.SetActive(false);
  59. }
  60. if (curLock != null)
  61. {
  62. curLock.SetActive(false);
  63. }
  64. }
  65. private void MoveToHeight()
  66. {
  67. curHeight = Mathf.SmoothDamp(curHeight, height, ref speed, 0.02f);
  68. transform.position = new Vector3(origPos.x, curHeight, origPos.z);
  69. }
  70. private void ChoosePlayer()
  71. {
  72. player1 = PlayersInput.instance[0];
  73. player2 = PlayersInput.instance[1];
  74. float dis1 = Vector2.Distance(player1.transform.position, transform.position);
  75. float dis2 = Vector2.Distance(player2.transform.position, transform.position);
  76. if (!player1.isDie && (player2.isDie || player2 == player1 || dis1 < dis2))
  77. {
  78. target = player1.gameObject;
  79. }
  80. else if (!player2.isDie && (player1.isDie || dis2 <= dis1))
  81. {
  82. target = player2.gameObject;
  83. }
  84. else
  85. {
  86. return;
  87. }
  88. isDoing = true;
  89. isFollow = true;
  90. pastTime = 0;
  91. curLock.SetActive(true);
  92. curLock.transform.position = transform.position;
  93. }
  94. Vector3 sp = Vector3.zero;
  95. private void FollowPlayer()
  96. {
  97. curLock.transform.position = Vector3.MoveTowards(curLock.transform.position, target.transform.position, 0.5f);
  98. //curLock.transform.position = Vector3.SmoothDamp(curLock.transform.position, target.transform.position, ref sp, 0.4f);
  99. if (Vector3.Distance(curLock.transform.position, target.transform.position) <= 1f)
  100. {
  101. curLock.transform.position = target.transform.position;
  102. isOn = true;
  103. isFollow = false;
  104. }
  105. }
  106. private void LockPlayer()
  107. {
  108. }
  109. public void FloatAttack()
  110. {
  111. curFe.transform.position = curLock.transform.position;
  112. curLock.SetActive(false);
  113. curFe.SetActive(true);
  114. }
  115. private void Update()
  116. {
  117. //出场飞升
  118. if (isRise)
  119. {
  120. MoveToHeight();
  121. if (curHeight - height <= 0.02f && curHeight - height >= -0.02f)
  122. {
  123. isRise = false;
  124. curHeight = height;
  125. transform.position = new Vector3(origPos.x, height, origPos.z);
  126. }
  127. }
  128. //隔一段时间发动一次锁定攻击
  129. if (!isRise && !isDoing && (ene.state == CharacterState.Idle || ene.state == CharacterState.Run || ene.state == CharacterState.Attack))
  130. {
  131. pastTime += Time.deltaTime;
  132. if (pastTime >= intervalTime)
  133. {
  134. ChoosePlayer();
  135. }
  136. }
  137. //跟随玩家
  138. if (isFollow)
  139. {
  140. FollowPlayer();
  141. }
  142. if (isOn)
  143. {
  144. pastTime += Time.deltaTime;
  145. if (pastTime >= followTime)
  146. {
  147. isFollow = false;
  148. isLock = true;
  149. pastTime = 0;
  150. isOn = false;
  151. }
  152. }
  153. //锁定范围
  154. if (isLock)
  155. {
  156. pastTime += Time.deltaTime;
  157. LockPlayer();
  158. if (pastTime >= lockTime)
  159. {
  160. isLock = false;
  161. isAttack = true;
  162. pastTime = 0;
  163. }
  164. }
  165. //攻击
  166. if (isAttack)
  167. {
  168. FloatAttack();
  169. isAttack = false;
  170. isDoing = false;
  171. }
  172. }
  173. }