Bullet.cs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  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. public Character owner;
  15. public Rigidbody rb;
  16. public List<BeHitTrigger> trigedObjs;
  17. public int damage;
  18. public float force;
  19. public bool changeHurt;
  20. public float repelValue;
  21. public BulletType bulletType;
  22. public bool isGetTarget = false;
  23. public float speed;
  24. public float maxFlyTime = 2f;
  25. public float flyTime;
  26. public bool isTrack;
  27. public Character trackTarget;
  28. [Header("回旋镖")]
  29. public bool isBack; //回旋镖,会回来
  30. public float stayTime; //在极点处停留时长
  31. private bool isStay = false;
  32. //private Vector3 curDir;
  33. private bool hasBack = false; //已经回来了
  34. [Header("传送门")]
  35. public bool canTransmit; //子弹是否能被传送门传送
  36. public bool haveTransmit; //刚传送过
  37. [HideInInspector]
  38. public float transmitTime; //传送CD
  39. public PortalsController portalsController;
  40. private bool isInVain; //击中光球,攻击无效
  41. private void Awake()
  42. {
  43. rb = GetComponent<Rigidbody>();
  44. }
  45. private void Update()
  46. {
  47. if (haveTransmit)
  48. {
  49. transmitTime -= Time.deltaTime;
  50. if (transmitTime <= 0)
  51. {
  52. haveTransmit = false;
  53. portalsController.rbs.Remove(rb);
  54. }
  55. }
  56. if(bulletType == BulletType.MagicLock)
  57. {
  58. if(Vector3.Distance(trackTarget.beSearchTrigger.transform.position,transform.position) < 0.1)
  59. {
  60. trackTarget.BeHit(damage, Vector3.zero, false, 0);
  61. gameObject.SetActive(false);
  62. }
  63. }
  64. }
  65. private void FixedUpdate()
  66. {
  67. if (bulletType != BulletType.MagicLock)
  68. {
  69. flyTime += Time.deltaTime;
  70. }
  71. if(flyTime >= maxFlyTime)
  72. {
  73. isGetTarget = true;
  74. gameObject.SetActive(false);
  75. return;
  76. }
  77. //回旋镖
  78. //if (!isStay && flyTime >= maxFlyTime)
  79. //{
  80. // if (!isBack)
  81. // {
  82. // isGetTarget = true;
  83. // gameObject.SetActive(false);
  84. // return;
  85. // }
  86. // else
  87. // {
  88. // isStay = true;
  89. // flyTime = 0;
  90. // rb.velocity = Vector3.zero;
  91. // }
  92. //}
  93. //if(isStay && flyTime >= stayTime)
  94. //{
  95. // isStay = false;
  96. // hasBack = true;
  97. // trackTarget = owner;
  98. //}
  99. //if (hasBack)
  100. //{
  101. // if (owner.gameObject.activeSelf == false)
  102. // {
  103. // isStay = true;
  104. // flyTime = 0;
  105. // rb.velocity = Vector3.zero;
  106. // }
  107. //}
  108. if (isTrack && trackTarget != null && !trackTarget.isDie && trackTarget.gameObject.activeInHierarchy)
  109. {
  110. Vector3 tarDir = (trackTarget.beSearchTrigger.transform.position - transform.position).normalized;
  111. transform.right = Vector3.Lerp(transform.right, -tarDir, 0.2f);
  112. rb.velocity = Vector3.Lerp(rb.velocity, speed * tarDir, 0.2f);
  113. }
  114. }
  115. public void BeShoot(Character own, Vector3 shootPos, Vector3 dir, int dmg, float fc, bool hurt, float repel, bool track = false, Character target = null)
  116. {
  117. transform.position = shootPos;
  118. transform.right = -dir;
  119. gameObject.SetActive(true);
  120. isGetTarget = false;
  121. owner = own;
  122. damage = dmg;
  123. force = fc;
  124. changeHurt = hurt;
  125. repelValue = repel;
  126. rb.velocity = dir * speed;
  127. isTrack = track;
  128. trackTarget = target;
  129. flyTime = 0;
  130. //curDir = dir;
  131. }
  132. private void OnTriggerEnter(Collider other)
  133. {
  134. if (isGetTarget || isInVain)
  135. {
  136. return;
  137. }
  138. Photosphere photosphere = other.GetComponentInParent<Photosphere>();
  139. if (photosphere && Util.CheckCanHit(owner.tag, "Player"))
  140. {
  141. isInVain = true;
  142. photosphere.Reflex(owner.beHitTrigger, damage);
  143. gameObject.SetActive(false);
  144. return;
  145. }
  146. //回旋镖
  147. //if (other.GetComponentInParent<Character>() == owner)
  148. //{
  149. // if (hasBack)
  150. // {
  151. // isGetTarget = true;
  152. // gameObject.SetActive(false);
  153. // return;
  154. // }
  155. //}
  156. BeHitTrigger hitTrigger = other.GetComponent<BeHitTrigger>();
  157. if (hitTrigger != null)
  158. {
  159. bool triged = false;
  160. for (int i = 0; i < trigedObjs.Count; i++)
  161. {
  162. if (trigedObjs[i] == hitTrigger)
  163. {
  164. triged = true;
  165. break;
  166. }
  167. }
  168. if (!triged)
  169. {
  170. trigedObjs.Add(hitTrigger);
  171. if (Util.CheckCanHit(owner.tag, hitTrigger.owner.tag) && !hitTrigger.owner.isDie)
  172. {
  173. switch (bulletType)
  174. {
  175. case BulletType.Single:
  176. hitTrigger.BeHit(damage, force * (-transform.right), changeHurt, repelValue);
  177. isGetTarget = true;
  178. gameObject.SetActive(false);
  179. break;
  180. case BulletType.Penetrate:
  181. hitTrigger.BeHit(damage, force * (-transform.right), changeHurt, repelValue);
  182. break;
  183. case BulletType.Bomb:
  184. break;
  185. default:
  186. break;
  187. }
  188. }
  189. }
  190. }
  191. }
  192. private void OnEnable()
  193. {
  194. trigedObjs.Clear();
  195. }
  196. }