BulletManager.cs 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. using System.Collections.Generic;
  2. using UnityEngine;
  3. using UnityEngine.SceneManagement;
  4. using UnityEngine.UI;
  5. public class BulletManager : MonoBehaviour
  6. {
  7. public Image[] bulletImages;
  8. public Sprite bulletSprite;
  9. public Sprite bulletHalfSprite;
  10. public Sprite emptyBulletSprite;
  11. //默认子弹数量
  12. public int defaultBulletCount = 15;
  13. private int bulletCount;
  14. public GameObject parent ;
  15. [SerializeField]
  16. [Tooltip("生成子弹不足提示的位置是否在是正中心")]
  17. bool bCenter = false;
  18. [SerializeField]
  19. [Tooltip("生成子弹不足提示的字体颜色")]
  20. Color bulletTipColor;
  21. //射击数
  22. private int numberOfShotsFired = 0;
  23. public int getBulletCount {
  24. get {
  25. return bulletCount;
  26. }
  27. }
  28. void Awake()
  29. {
  30. if (BluetoothAim.ins && BluetoothAim.ins.isMainConnectToGunType().isGun && BluetoothAim.ins.isMainConnectToGunType().gunType == AimDeviceType.RifleM416)
  31. {
  32. //m416 连接蓝牙的情况下,设置默认子弹数量
  33. defaultBulletCount = 30;
  34. }
  35. numberOfShotsFired = 0;
  36. ResetBullets();
  37. }
  38. public void Update()
  39. {
  40. if (Input.GetKeyDown(KeyCode.Q))
  41. {
  42. if (bulletZero()) return;
  43. FireBullet();
  44. }
  45. }
  46. public void FireBullet()
  47. {
  48. if (bulletCount > 0)
  49. {
  50. bulletCount--;
  51. UpdateBullets();
  52. //记录射击的总数
  53. numberOfShotsFired++;
  54. }
  55. }
  56. public void ResetBullets()
  57. {
  58. bulletCount = defaultBulletCount;
  59. UpdateBullets();
  60. }
  61. //是否判断射击完使用
  62. public bool NumberOfShotsFired() {
  63. return numberOfShotsFired >= defaultBulletCount ? true : false;
  64. }
  65. public bool bulletZero(PlayerType playerType = PlayerType.FirstPlayer) {
  66. if (getBulletCount == 0) {
  67. if (SceneManager.GetActiveScene().name == "InfraredGameDouble")
  68. {
  69. Create(parent.transform, bCenter, bulletTipColor, false, playerType == PlayerType.FirstPlayer? - Screen.width / 4f : Screen.width / 4f);
  70. }
  71. else {
  72. Create(parent.transform, bCenter, bulletTipColor);
  73. }
  74. //暂时自动刷新,接入协议后修改效果
  75. //ResetBullets();
  76. return true;
  77. }
  78. return false;
  79. }
  80. /// <summary>
  81. /// 不需要自动删除
  82. /// </summary>
  83. /// <returns></returns>
  84. public bool bulletZeroNotDelete() {
  85. if (getBulletCount == 0)
  86. {
  87. //禁用自动删除
  88. Create(parent.transform, bCenter, bulletTipColor,true);
  89. return true;
  90. }
  91. return false;
  92. }
  93. /// <summary>
  94. /// 外部调用:手动删除所有 TipBulletNumber
  95. /// </summary>
  96. public static void RemoveBulletExternally()
  97. {
  98. for (int i = bulletNumber.Count - 1; i >= 0; i--)
  99. {
  100. if (bulletNumber[i] != null)
  101. {
  102. bulletNumber[i].Remove();
  103. }
  104. }
  105. bulletNumber.Clear();
  106. }
  107. private void UpdateBullets()
  108. {
  109. if (defaultBulletCount == 30)
  110. {
  111. int fullUnits = bulletCount / 2;
  112. bool hasHalf = bulletCount % 2 == 1;
  113. for (int i = 0; i < bulletImages.Length; i++)
  114. {
  115. if (i < fullUnits)
  116. {
  117. bulletImages[i].sprite = bulletSprite;
  118. }
  119. else if (i == fullUnits && hasHalf)
  120. {
  121. bulletImages[i].sprite = bulletHalfSprite;
  122. }
  123. else
  124. {
  125. bulletImages[i].sprite = emptyBulletSprite;
  126. }
  127. }
  128. }
  129. else
  130. {
  131. // 原逻辑:每发子弹一格
  132. for (int i = 0; i < bulletImages.Length; i++)
  133. {
  134. if (i < bulletCount)
  135. {
  136. bulletImages[i].sprite = bulletSprite;
  137. }
  138. else
  139. {
  140. bulletImages[i].sprite = emptyBulletSprite;
  141. }
  142. }
  143. }
  144. }
  145. static List<TipBulletNumber> bulletNumber = new();
  146. public static void Create(Transform parentTran,bool centerPos,Color color, bool disableAutoDelete = false ,float posX = 0)
  147. {
  148. //清空对象
  149. //for (int i = bulletNumber.Count - 1; i >= 0; i--)
  150. //{
  151. // Destroy(bulletNumber[i].gameObject);
  152. // bulletNumber.RemoveAt(i);
  153. //}
  154. RemoveBulletExternally();
  155. GameObject o = Instantiate(Resources.Load<GameObject>("Common/TipBulletNumber"));
  156. // 重置Transform属性
  157. o.transform.SetParent(parentTran);
  158. TipBulletNumber tip = o.GetComponent<TipBulletNumber>();
  159. tip.SetOutTipColor(color);
  160. tip.SetDisableAutoDelete(disableAutoDelete); // 设置是否禁用自动删除
  161. bulletNumber.Add(tip);
  162. // 获取RectTransform组件
  163. RectTransform rectTransform = o.GetComponent<RectTransform>();
  164. // 设置相对于锚点的偏移位置
  165. if (centerPos)
  166. {
  167. rectTransform.anchorMin = new Vector2(0.5f, 0.5f);
  168. rectTransform.anchorMax = new Vector2(0.5f, 0.5f);
  169. //rectTransform.anchoredPosition = new Vector2(0, rectTransform.rect.height / 2);
  170. rectTransform.anchoredPosition = new Vector2(0, 0);
  171. rectTransform.localRotation = Quaternion.identity;
  172. rectTransform.localScale = Vector3.one;
  173. }
  174. else {
  175. float _posX = 0;
  176. RectTransform imageRect = o.transform.Find("Image").GetComponent<RectTransform>();
  177. // 强制刷新它的布局
  178. LayoutRebuilder.ForceRebuildLayoutImmediate(imageRect);
  179. float _childX = imageRect.rect.width;
  180. if (posX > 0)
  181. {
  182. _posX = posX - _childX * 0.5f - 80;
  183. }
  184. else if(posX < 0) {
  185. _posX = -(Mathf.Abs(posX) - _childX * 0.5f - 80);
  186. }
  187. rectTransform.anchoredPosition = new Vector2(_posX, 120);
  188. rectTransform.localRotation = Quaternion.identity;
  189. rectTransform.localScale = Vector3.one;
  190. }
  191. //o.GetComponentInChildren<Text>().text = number.ToString($"f{CommonConfig.ringsPrecision}");
  192. }
  193. }