using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class BulletManager : MonoBehaviour
{
public Image[] bulletImages;
public Sprite bulletSprite;
public Sprite bulletHalfSprite;
public Sprite emptyBulletSprite;
//默认子弹数量
public int defaultBulletCount = 15;
private int bulletCount;
public GameObject parent ;
[SerializeField]
[Tooltip("生成子弹不足提示的位置是否在是正中心")]
bool bCenter = false;
[SerializeField]
[Tooltip("生成子弹不足提示的字体颜色")]
Color bulletTipColor;
//射击数
private int numberOfShotsFired = 0;
public int getBulletCount {
get {
return bulletCount;
}
}
void Awake()
{
if (BluetoothAim.ins && BluetoothAim.ins.isMainConnectToGunType().isGun && BluetoothAim.ins.isMainConnectToGunType().gunType == AimDeviceType.RifleM416)
{
//m416 连接蓝牙的情况下,设置默认子弹数量
defaultBulletCount = 30;
}
numberOfShotsFired = 0;
ResetBullets();
}
public void Update()
{
if (Input.GetKeyDown(KeyCode.Q))
{
if (bulletZero()) return;
FireBullet();
}
}
public void FireBullet()
{
if (bulletCount > 0)
{
bulletCount--;
UpdateBullets();
//记录射击的总数
numberOfShotsFired++;
}
}
public void ResetBullets()
{
bulletCount = defaultBulletCount;
UpdateBullets();
}
//是否判断射击完使用
public bool NumberOfShotsFired() {
return numberOfShotsFired >= defaultBulletCount ? true : false;
}
public bool bulletZero(PlayerType playerType = PlayerType.FirstPlayer) {
if (getBulletCount == 0) {
if (SceneManager.GetActiveScene().name == "InfraredGameDouble")
{
Create(parent.transform, bCenter, bulletTipColor, false, playerType == PlayerType.FirstPlayer? - Screen.width / 4f : Screen.width / 4f);
}
else {
Create(parent.transform, bCenter, bulletTipColor);
}
//暂时自动刷新,接入协议后修改效果
//ResetBullets();
return true;
}
return false;
}
///
/// 不需要自动删除
///
///
public bool bulletZeroNotDelete() {
if (getBulletCount == 0)
{
//禁用自动删除
Create(parent.transform, bCenter, bulletTipColor,true);
return true;
}
return false;
}
///
/// 外部调用:手动删除所有 TipBulletNumber
///
public static void RemoveBulletExternally()
{
for (int i = bulletNumber.Count - 1; i >= 0; i--)
{
if (bulletNumber[i] != null)
{
bulletNumber[i].Remove();
}
}
bulletNumber.Clear();
}
private void UpdateBullets()
{
if (defaultBulletCount == 30)
{
int fullUnits = bulletCount / 2;
bool hasHalf = bulletCount % 2 == 1;
for (int i = 0; i < bulletImages.Length; i++)
{
if (i < fullUnits)
{
bulletImages[i].sprite = bulletSprite;
}
else if (i == fullUnits && hasHalf)
{
bulletImages[i].sprite = bulletHalfSprite;
}
else
{
bulletImages[i].sprite = emptyBulletSprite;
}
}
}
else
{
// 原逻辑:每发子弹一格
for (int i = 0; i < bulletImages.Length; i++)
{
if (i < bulletCount)
{
bulletImages[i].sprite = bulletSprite;
}
else
{
bulletImages[i].sprite = emptyBulletSprite;
}
}
}
}
static List bulletNumber = new();
public static void Create(Transform parentTran,bool centerPos,Color color, bool disableAutoDelete = false ,float posX = 0)
{
//清空对象
//for (int i = bulletNumber.Count - 1; i >= 0; i--)
//{
// Destroy(bulletNumber[i].gameObject);
// bulletNumber.RemoveAt(i);
//}
RemoveBulletExternally();
GameObject o = Instantiate(Resources.Load("Common/TipBulletNumber"));
// 重置Transform属性
o.transform.SetParent(parentTran);
TipBulletNumber tip = o.GetComponent();
tip.SetOutTipColor(color);
tip.SetDisableAutoDelete(disableAutoDelete); // 设置是否禁用自动删除
bulletNumber.Add(tip);
// 获取RectTransform组件
RectTransform rectTransform = o.GetComponent();
// 设置相对于锚点的偏移位置
if (centerPos)
{
rectTransform.anchorMin = new Vector2(0.5f, 0.5f);
rectTransform.anchorMax = new Vector2(0.5f, 0.5f);
//rectTransform.anchoredPosition = new Vector2(0, rectTransform.rect.height / 2);
rectTransform.anchoredPosition = new Vector2(0, 0);
rectTransform.localRotation = Quaternion.identity;
rectTransform.localScale = Vector3.one;
}
else {
float _posX = 0;
RectTransform imageRect = o.transform.Find("Image").GetComponent();
// 强制刷新它的布局
LayoutRebuilder.ForceRebuildLayoutImmediate(imageRect);
float _childX = imageRect.rect.width;
if (posX > 0)
{
_posX = posX - _childX * 0.5f - 80;
}
else if(posX < 0) {
_posX = -(Mathf.Abs(posX) - _childX * 0.5f - 80);
}
rectTransform.anchoredPosition = new Vector2(_posX, 120);
rectTransform.localRotation = Quaternion.identity;
rectTransform.localScale = Vector3.one;
}
//o.GetComponentInChildren().text = number.ToString($"f{CommonConfig.ringsPrecision}");
}
}