Bullet.cs 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  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. Vector3 dis1 = trackTarget.beSearchTrigger.transform.position;
  59. Vector3 dis2 = transform.position;
  60. dis2.z = dis1.z;
  61. if (Vector3.Distance(dis1,dis2) < 0.1)
  62. {
  63. trackTarget.BeHit(damage, Vector3.zero, false, 0);
  64. if (trackTarget.debugAttackFrom)
  65. {
  66. trackTarget.DebugAttackFrom(owner.name, damage);
  67. }
  68. gameObject.SetActive(false);
  69. }
  70. }
  71. }
  72. private void FixedUpdate()
  73. {
  74. if (bulletType != BulletType.MagicLock)
  75. {
  76. flyTime += Time.deltaTime;
  77. }
  78. if(flyTime >= maxFlyTime)
  79. {
  80. isGetTarget = true;
  81. gameObject.SetActive(false);
  82. return;
  83. }
  84. //回旋镖
  85. //if (!isStay && flyTime >= maxFlyTime)
  86. //{
  87. // if (!isBack)
  88. // {
  89. // isGetTarget = true;
  90. // gameObject.SetActive(false);
  91. // return;
  92. // }
  93. // else
  94. // {
  95. // isStay = true;
  96. // flyTime = 0;
  97. // rb.velocity = Vector3.zero;
  98. // }
  99. //}
  100. //if(isStay && flyTime >= stayTime)
  101. //{
  102. // isStay = false;
  103. // hasBack = true;
  104. // trackTarget = owner;
  105. //}
  106. //if (hasBack)
  107. //{
  108. // if (owner.gameObject.activeSelf == false)
  109. // {
  110. // isStay = true;
  111. // flyTime = 0;
  112. // rb.velocity = Vector3.zero;
  113. // }
  114. //}
  115. if (isTrack && trackTarget != null && !trackTarget.isDie && trackTarget.gameObject.activeInHierarchy)
  116. {
  117. Vector3 tarDir = (trackTarget.beSearchTrigger.transform.position - transform.position).normalized;
  118. tarDir.z = 0;
  119. transform.right = Vector3.Lerp(transform.right, -tarDir, 0.2f);
  120. rb.velocity = Vector3.Lerp(rb.velocity, speed * tarDir, 0.2f);
  121. }
  122. }
  123. public void BeShoot(Character own, Vector3 shootPos, Vector3 dir, int dmg, float fc, bool hurt, float repel, bool track = false, Character target = null)
  124. {
  125. transform.position = shootPos;
  126. transform.right = -dir;
  127. gameObject.SetActive(true);
  128. isGetTarget = false;
  129. owner = own;
  130. damage = dmg;
  131. force = fc;
  132. changeHurt = hurt;
  133. repelValue = repel;
  134. rb.velocity = dir * speed;
  135. isTrack = track;
  136. trackTarget = target;
  137. flyTime = 0;
  138. //curDir = dir;
  139. }
  140. private void OnTriggerEnter(Collider other)
  141. {
  142. if (isGetTarget || isInVain)
  143. {
  144. return;
  145. }
  146. Photosphere photosphere = other.GetComponentInParent<Photosphere>();
  147. if (photosphere && Util.CheckCanHit(owner.tag, "Player"))
  148. {
  149. isInVain = true;
  150. photosphere.Reflex(owner.beHitTrigger, damage);
  151. gameObject.SetActive(false);
  152. return;
  153. }
  154. //回旋镖
  155. //if (other.GetComponentInParent<Character>() == owner)
  156. //{
  157. // if (hasBack)
  158. // {
  159. // isGetTarget = true;
  160. // gameObject.SetActive(false);
  161. // return;
  162. // }
  163. //}
  164. BeHitTrigger hitTrigger = other.GetComponent<BeHitTrigger>();
  165. if (hitTrigger != null)
  166. {
  167. bool triged = false;
  168. for (int i = 0; i < trigedObjs.Count; i++)
  169. {
  170. if (trigedObjs[i] == hitTrigger)
  171. {
  172. triged = true;
  173. break;
  174. }
  175. }
  176. if (!triged)
  177. {
  178. trigedObjs.Add(hitTrigger);
  179. if (Util.CheckCanHit(owner.tag, hitTrigger.owner.tag) && !hitTrigger.owner.isDie)
  180. {
  181. //计算护甲减免
  182. int curDamage = damage;
  183. int am = hitTrigger.owner.armor;
  184. if (am > 0)
  185. {
  186. int ap = owner.armorPiercing;
  187. int c = am - ap;
  188. if (c < 0)
  189. {
  190. c = 0;
  191. }
  192. curDamage = (int)(curDamage * (100f / (100 + c)) + 0.5f);
  193. }
  194. switch (bulletType)
  195. {
  196. case BulletType.Single:
  197. hitTrigger.BeHit(curDamage, force * (-transform.right), changeHurt, repelValue);
  198. if (hitTrigger.owner.debugAttackFrom)
  199. {
  200. hitTrigger.owner.DebugAttackFrom(owner.name, curDamage);
  201. }
  202. isGetTarget = true;
  203. gameObject.SetActive(false);
  204. break;
  205. case BulletType.Penetrate:
  206. hitTrigger.BeHit(curDamage, force * (-transform.right), changeHurt, repelValue);
  207. if (hitTrigger.owner.debugAttackFrom)
  208. {
  209. hitTrigger.owner.DebugAttackFrom(owner.name, curDamage);
  210. }
  211. break;
  212. case BulletType.Bomb:
  213. break;
  214. default:
  215. break;
  216. }
  217. }
  218. }
  219. }
  220. }
  221. private void OnEnable()
  222. {
  223. trigedObjs.Clear();
  224. }
  225. }