Bullet.cs 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  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. MagicLock = 3, //锁定目标,只会击中目标
  11. }
  12. public class Bullet : MonoBehaviour
  13. {
  14. [Header("是否留下箭种")]
  15. public bool canStop;
  16. public float stopTime;
  17. [Header("组件")]
  18. public Character owner;
  19. public AttackInfo attackInfo;
  20. public Rigidbody rb;
  21. public List<BeHitTrigger> trigedObjs;
  22. public BulletType bulletType;
  23. public bool isGetTarget = false;
  24. public float speed;
  25. public float maxFlyTime = 2f;
  26. public float flyTime;
  27. [Header("子弹是否追踪,不勾选则水平往前射出")]
  28. public bool isTrack;
  29. [Header("子弹是否始终追踪,勾选:子弹会跟着目标转,不勾选:子弹斜着往前直飞")]
  30. public bool canAlwaysTrack;
  31. public Character trackTarget;
  32. [Header("传送门")]
  33. public bool canTransmit; //子弹是否能被传送门传送
  34. public bool haveTransmit; //刚传送过
  35. [HideInInspector]
  36. public float transmitTime; //传送CD
  37. public PortalsController portalsController;
  38. private bool isInVain; //击中光球,攻击无效
  39. private void Awake()
  40. {
  41. rb = GetComponent<Rigidbody>();
  42. }
  43. private void Update()
  44. {
  45. if (haveTransmit)
  46. {
  47. transmitTime -= Time.deltaTime;
  48. if (transmitTime <= 0)
  49. {
  50. haveTransmit = false;
  51. portalsController.rbs.Remove(rb);
  52. }
  53. }
  54. if(bulletType == BulletType.MagicLock)
  55. {
  56. Vector3 dis1 = trackTarget.beSearchTrigger.transform.position;
  57. Vector3 dis2 = transform.position;
  58. dis2.z = dis1.z;
  59. if (Vector3.Distance(dis1,dis2) < 0.1)
  60. {
  61. trackTarget.BeHit(attackInfo, transform.position.x < trackTarget.transform.position.x?-1:1) ;
  62. if (trackTarget.debugAttackFrom)
  63. {
  64. trackTarget.DebugAttackFrom(owner.name, attackInfo.damage);
  65. }
  66. gameObject.SetActive(false);
  67. }
  68. }
  69. }
  70. private void FixedUpdate()
  71. {
  72. if (bulletType != BulletType.MagicLock)
  73. {
  74. flyTime += Time.deltaTime;
  75. }
  76. if(flyTime >= maxFlyTime)
  77. {
  78. isGetTarget = true;
  79. gameObject.SetActive(false);
  80. return;
  81. }
  82. if (isTrack && trackTarget != null && !trackTarget.isDie && trackTarget.gameObject.activeInHierarchy)
  83. {
  84. if (canAlwaysTrack)
  85. {
  86. Vector3 tarDir = (trackTarget.beSearchTrigger.transform.position - transform.position).normalized;
  87. tarDir.z = 0;
  88. transform.right = Vector3.Lerp(transform.right, -tarDir, 0.2f);
  89. rb.velocity = Vector3.Lerp(rb.velocity, speed * tarDir, 0.2f);
  90. }
  91. }
  92. }
  93. public void BeShoot(Character own, Vector3 shootPos, Vector3 dir, bool aim = false, bool alwaysTrack = false, Character target = null)
  94. {
  95. transform.position = shootPos;
  96. transform.right = -dir;
  97. isTrack = aim;
  98. rb.velocity = dir * speed;
  99. trackTarget = target;
  100. owner = own;
  101. if (isTrack && trackTarget != null && !trackTarget.isDie && trackTarget.gameObject.activeInHierarchy)
  102. {
  103. Vector3 tarDir = (trackTarget.beSearchTrigger.transform.position - transform.position).normalized;
  104. tarDir.z = 0;
  105. transform.right = -tarDir;
  106. rb.velocity = speed * tarDir;
  107. }
  108. gameObject.SetActive(true);
  109. isGetTarget = false;
  110. canAlwaysTrack = alwaysTrack;
  111. flyTime = 0;
  112. attackInfo = own.attackController.attackInfo;
  113. }
  114. private void OnTriggerEnter(Collider other)
  115. {
  116. if (isGetTarget || isInVain)
  117. {
  118. return;
  119. }
  120. Photosphere photosphere = other.GetComponentInParent<Photosphere>();
  121. if (photosphere && Util.CheckCanHit(owner.tag, "Player"))
  122. {
  123. isInVain = true;
  124. photosphere.Reflex(owner.beHitTrigger, owner.attackController.attackInfo.damage);
  125. gameObject.SetActive(false);
  126. return;
  127. }
  128. BeHitTrigger hitTrigger = other.GetComponent<BeHitTrigger>();
  129. if (hitTrigger != null)
  130. {
  131. bool triged = false;
  132. for (int i = 0; i < trigedObjs.Count; i++)
  133. {
  134. if (trigedObjs[i] == hitTrigger)
  135. {
  136. triged = true;
  137. break;
  138. }
  139. }
  140. if (!triged)
  141. {
  142. trigedObjs.Add(hitTrigger);
  143. if (Util.CheckCanHit(owner.tag, hitTrigger.owner.tag) && !hitTrigger.owner.isDie)
  144. {
  145. float dir = transform.position.x < hitTrigger.transform.position.x ? -1 : 1;
  146. switch (bulletType)
  147. {
  148. case BulletType.Single:
  149. hitTrigger.BeHit(attackInfo, dir);
  150. if (hitTrigger.owner.debugAttackFrom)
  151. {
  152. hitTrigger.owner.DebugAttackFrom(owner.name, attackInfo.damage);
  153. }
  154. isGetTarget = true;
  155. if (canStop && (hitTrigger.owner.gameObject.layer == 6 || hitTrigger.owner.gameObject.layer == 7))
  156. {
  157. rb.velocity = Vector3.zero;
  158. rb.isKinematic = true;
  159. GetComponent<Collider>().enabled = false;
  160. transform.parent = hitTrigger.transform;
  161. BulletStop bs = GetComponent<BulletStop>();
  162. if (bs)
  163. {
  164. bs.enabled = true;
  165. }
  166. else
  167. {
  168. bs = gameObject.AddComponent<BulletStop>();
  169. }
  170. bs.SetDisappearTime(stopTime);
  171. enabled = false;
  172. }
  173. else
  174. {
  175. gameObject.SetActive(false);
  176. }
  177. break;
  178. case BulletType.Penetrate:
  179. hitTrigger.BeHit(attackInfo,dir);
  180. if (hitTrigger.owner.debugAttackFrom)
  181. {
  182. hitTrigger.owner.DebugAttackFrom(owner.name, attackInfo.damage);
  183. }
  184. break;
  185. case BulletType.Bomb:
  186. break;
  187. default:
  188. break;
  189. }
  190. }
  191. }
  192. }
  193. }
  194. private void OnEnable()
  195. {
  196. trigedObjs.Clear();
  197. }
  198. }