Чтобы реализовать счетчик оставшихся патронов для вашего автомата в Unity, вам нужно обновить интерфейс пользователя (UI), чтобы отображать количество патронов как в магазине, так и в запасах. Вы можете сделать это с помощью компонента `Text` или `TMP_Text` (если вы используете TextMeshPro).
Вот шаги для реализации счетчика патронов:
1. **Добавьте UI-элементы на сцену**:
- Создайте `Canvas` на вашей сцене, если у вас его еще нет.
- Внутри `Canvas` добавьте текстовый элемент `Text` или `TMP_Text`. Это будет ваш счетчик патронов.
2. **Создайте скрипт для управления UI**:
- Создайте новый C# скрипт, например, `AmmoUIManager`, и прикрепите его к Canvas или другому объекту на сцене.
- Внутри этого скрипта вам нужно будет обновлять текст на основе оставшихся патронов.
Вот пример кода для `AmmoUIManager`:
```csharp
using UnityEngine;
using UnityEngine.UI; // не забудьте импортировать для работы с UI
public class AmmoUIManager : MonoBehaviour
{
public Text ammoText; // ссылка на текстовый элемент для отображения патронов
public Text totalAmmoText; // ссылка на текст для отображения общего количества патронов
public Ak12 ak12; // ссылка на ваш скрипт Ak12
void Update()
{
UpdateAmmoDisplay();
}
void UpdateAmmoDisplay()
{
ammoText.text = "Ammo: " + ak12.GetCurrentAmmo();
totalAmmoText.text = "Total Ammo: " + ak12.GetTotalAmmo();
}
}
```
3. **Обновите ваш класс `Ak12`**:
- Добавьте публичные методы для получения текущего количества патронов в магазине и общего количества патронов.
Вот обновленный класс `Ak12` с новыми методами:
```csharp
public class Ak12 : MonoBehaviour
{
private Animator anim;
[SerializeField] private int TotalAmmo = 120;
[SerializeField] private int AmmoNeedToReload = 30;
public float range = 100f;
public float FireRate = 15f;
public float NextTimeToFire = 0f;
[SerializeField] private int ammo = 30;
public Camera fpsCam;
void Start()
{
anim = GetComponent<Animator>();
}
void Update()
{
if (Input.GetButtonDown("Fire1") && ammo > 0)
{
Shoot();
NextTimeToFire = Time.time + 1f / FireRate;
StartCoroutine(AmmoMinus());
}
if (Input.GetButton("Fire1"))
{
StopCoroutine(AmmoMinus());
}
if (Input.GetKey(KeyCode.R) && ammo < AmmoNeedToReload)
{
anim.SetBool("Reload", true);
}
}
private IEnumerator AmmoMinus()
{
yield return new WaitForSeconds(0.2f);
ammo -= 1;
}
public void Reload()
{
if (TotalAmmo > 0)
{
int ammoToReload = Mathf.Min(AmmoNeedToReload - ammo, TotalAmmo);
ammo += ammoToReload;
TotalAmmo -= ammoToReload;
}
}
public int GetCurrentAmmo()
{
return ammo;
}
public int GetTotalAmmo()
{
return TotalAmmo;
}
private void Shoot()
{
RaycastHit hit;
if (Physics.Raycast(fpsCam.transform.position, fpsCam.transform.forward, out hit, range))
{
Debug.Log(hit.transform.name);
if (hit.transform.CompareTag("box"))
{
// Ваша логика здесь
}
}
}
private void AnimToggle()
{
anim.SetBool("Reload", false);
}
}
```
4. **Настройте в Unity**:
- Перейдите в инспектор для `AmmoUIManager` и свяжите текстовые элементы с соответствующими переменными в скрипте и ваш скрипт `Ak12` с переменной `ak12`.
Теперь, если вы добавите туда функциональность перезарядки (обновляя общее количество патронов и текущие патроны), вы сможете видеть актуальное количество патронов как в магазине, так и в запасах во время игры. Не забудьте завершить реализацию метода перезарядки так, чтобы вызывался метод `Reload()` из вашего класса `Ak12` при