Bullet.cs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. using Base.Common;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. public enum BulletType
  6. {
  7. Single = 0, //单体目标,触发后即销毁
  8. Penetrate = 1, //穿透,可击中多个目标
  9. Bomb = 2, //击中目标后爆炸
  10. }
  11. public class Bullet : MonoBehaviour
  12. {
  13. public Character owner;
  14. public Rigidbody rb;
  15. public List<BeHitTrigger> trigedObjs;
  16. public int damage;
  17. public float force;
  18. public bool changeHurt;
  19. public float repelValue;
  20. public BulletType bulletType;
  21. public bool isGetTarget = false;
  22. public float speed;
  23. public float maxFlyTime = 2f;
  24. public float flyTime;
  25. public bool isTrack;
  26. public Character trackTarget;
  27. [Header("回旋镖")]
  28. public bool isBack; //回旋镖,会回来
  29. public float stayTime; //在极点处停留时长
  30. private bool isStay = false;
  31. private Vector3 curDir;
  32. private bool hasBack = false; //已经回来了
  33. [Header("漂浮")]
  34. public bool toFloat = false;
  35. private void Awake()
  36. {
  37. //owner = GetComponentInParent<Character>();
  38. rb = GetComponent<Rigidbody>();
  39. }
  40. private void FixedUpdate()
  41. {
  42. flyTime += Time.deltaTime;
  43. if (!isStay && flyTime >= maxFlyTime)
  44. {
  45. if (!isBack)
  46. {
  47. isGetTarget = true;
  48. gameObject.SetActive(false);
  49. return;
  50. }
  51. else
  52. {
  53. isStay = true;
  54. flyTime = 0;
  55. rb.velocity = Vector3.zero;
  56. }
  57. }
  58. if(isStay && flyTime >= stayTime)
  59. {
  60. isStay = false;
  61. hasBack = true;
  62. trackTarget = owner;
  63. }
  64. if (hasBack)
  65. {
  66. if (owner.gameObject.activeSelf == false)
  67. {
  68. isStay = true;
  69. flyTime = 0;
  70. rb.velocity = Vector3.zero;
  71. }
  72. }
  73. if (isTrack && trackTarget != null && !trackTarget.isDie && trackTarget.gameObject.activeInHierarchy)
  74. {
  75. Vector3 tarDir = (trackTarget.beSearchTrigger.transform.position - transform.position).normalized;
  76. transform.right = Vector3.Lerp(transform.right, -tarDir, 0.2f);
  77. rb.velocity = Vector3.Lerp(rb.velocity, speed * tarDir, 0.2f);
  78. }
  79. }
  80. public void BeShoot(Character own, Vector3 shootPos, Vector3 dir, int dmg, float fc, bool hurt, float repel, bool track = false, Character target = null)
  81. {
  82. transform.position = shootPos;
  83. transform.right = -dir;
  84. gameObject.SetActive(true);
  85. isGetTarget = false;
  86. owner = own;
  87. damage = dmg;
  88. force = fc;
  89. changeHurt = hurt;
  90. repelValue = repel;
  91. rb.velocity = dir * speed;
  92. isTrack = track;
  93. trackTarget = target;
  94. flyTime = 0;
  95. curDir = dir;
  96. }
  97. private void OnTriggerEnter(Collider other)
  98. {
  99. if (other.GetComponentInParent<Character>() == owner)
  100. {
  101. if (hasBack)
  102. {
  103. isGetTarget = true;
  104. gameObject.SetActive(false);
  105. return;
  106. }
  107. }
  108. if (other.CompareTag("Plane"))
  109. {
  110. isGetTarget = true;
  111. gameObject.SetActive(false);
  112. }
  113. if (isGetTarget)
  114. {
  115. return;
  116. }
  117. BeHitTrigger hitTrigger = other.GetComponent<BeHitTrigger>();
  118. if (hitTrigger != null)
  119. {
  120. bool triged = false;
  121. for (int i = 0; i < trigedObjs.Count; i++)
  122. {
  123. if (trigedObjs[i] == hitTrigger)
  124. {
  125. triged = true;
  126. break;
  127. }
  128. }
  129. if (!triged)
  130. {
  131. trigedObjs.Add(hitTrigger);
  132. if (Util.CheckCanHit(owner.tag, hitTrigger.owner.tag) && !hitTrigger.owner.isDie)
  133. {
  134. switch (bulletType)
  135. {
  136. case BulletType.Single:
  137. hitTrigger.BeHit(damage, force * (-transform.right), changeHurt, repelValue);
  138. isGetTarget = true;
  139. gameObject.SetActive(false);
  140. break;
  141. case BulletType.Penetrate:
  142. hitTrigger.BeHit(damage, force * (-transform.right), changeHurt, repelValue);
  143. break;
  144. case BulletType.Bomb:
  145. break;
  146. default:
  147. break;
  148. }
  149. if (toFloat)
  150. {
  151. owner.attackToFloat = false;
  152. owner.hasFloatTimes += 1;
  153. if (owner.hasFloatTimes == owner.floatTimes)
  154. {
  155. owner.canHitFloat = false;
  156. }
  157. toFloat = false;
  158. if (hitTrigger.tag != "EnemyTower")
  159. {
  160. hitTrigger.owner.GetComponent<MoveCharacter>().FloatStateOn();
  161. }
  162. }
  163. }
  164. }
  165. }
  166. }
  167. private void OnEnable()
  168. {
  169. trigedObjs.Clear();
  170. }
  171. }