BulletManager.cs 6.4 KB

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