Bullet.cs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  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 float hasStayTime;
  31. private bool isStay = false;
  32. private Vector3 curDir;
  33. private bool hasBack = false; //已经回来了
  34. [Header("漂浮")]
  35. public bool toFloat = false;
  36. private void Awake()
  37. {
  38. //owner = GetComponentInParent<Character>();
  39. rb = GetComponent<Rigidbody>();
  40. }
  41. private void FixedUpdate()
  42. {
  43. flyTime += Time.deltaTime;
  44. if (!isStay && flyTime >= maxFlyTime)
  45. {
  46. if (!isBack || isBack && hasBack)
  47. {
  48. isGetTarget = true;
  49. gameObject.SetActive(false);
  50. return;
  51. }
  52. else
  53. {
  54. flyTime = 0;
  55. rb.velocity = Vector3.zero;
  56. }
  57. }
  58. if(isStay && flyTime >= stayTime)
  59. {
  60. isStay = false;
  61. flyTime = 0;
  62. rb.velocity = -curDir * speed;
  63. hasBack = true;
  64. Vector3 origScale = transform.localScale;
  65. transform.localScale = new Vector3(-origScale.x, origScale.y, origScale.z);
  66. }
  67. if (isTrack && trackTarget != null && !trackTarget.isDie && trackTarget.gameObject.activeInHierarchy)
  68. {
  69. Vector3 tarDir = (trackTarget.beSearchTrigger.transform.position - transform.position).normalized;
  70. transform.right = Vector3.Lerp(transform.right, -tarDir, 0.2f);
  71. rb.velocity = Vector3.Lerp(rb.velocity, speed * tarDir, 0.2f);
  72. }
  73. }
  74. public void BeShoot(Character own, Vector3 shootPos, Vector3 dir, int dmg, float fc, bool hurt, float repel, bool track = false, Character target = null)
  75. {
  76. transform.position = shootPos;
  77. transform.right = -dir;
  78. gameObject.SetActive(true);
  79. isGetTarget = false;
  80. owner = own;
  81. damage = dmg;
  82. force = fc;
  83. changeHurt = hurt;
  84. repelValue = repel;
  85. rb.velocity = dir * speed;
  86. isTrack = track;
  87. trackTarget = target;
  88. flyTime = 0;
  89. curDir = dir;
  90. }
  91. private void OnTriggerEnter(Collider other)
  92. {
  93. if (other.CompareTag("Plane"))
  94. {
  95. isGetTarget = true;
  96. gameObject.SetActive(false);
  97. }
  98. if (isGetTarget)
  99. {
  100. return;
  101. }
  102. BeHitTrigger hitTrigger = other.GetComponent<BeHitTrigger>();
  103. if (hitTrigger != null)
  104. {
  105. bool triged = false;
  106. for (int i = 0; i < trigedObjs.Count; i++)
  107. {
  108. if (trigedObjs[i] == hitTrigger)
  109. {
  110. triged = true;
  111. break;
  112. }
  113. }
  114. if (!triged)
  115. {
  116. trigedObjs.Add(hitTrigger);
  117. if (Util.CheckCanHit(owner.tag, hitTrigger.owner.tag) && !hitTrigger.owner.isDie)
  118. {
  119. switch (bulletType)
  120. {
  121. case BulletType.Single:
  122. hitTrigger.BeHit(damage, force * (-transform.right), changeHurt, repelValue);
  123. isGetTarget = true;
  124. gameObject.SetActive(false);
  125. break;
  126. case BulletType.Penetrate:
  127. hitTrigger.BeHit(damage, force * (-transform.right), changeHurt, repelValue);
  128. break;
  129. case BulletType.Bomb:
  130. break;
  131. default:
  132. break;
  133. }
  134. if (toFloat)
  135. {
  136. owner.attackToFloat = false;
  137. toFloat = false;
  138. hitTrigger.owner.GetComponent<MoveCharacter>().FloatStateOn();
  139. }
  140. }
  141. }
  142. }
  143. }
  144. private void OnEnable()
  145. {
  146. trigedObjs.Clear();
  147. }
  148. }