Как реализовать счётчик оставшихся патронов для автомата в Unity?

У меня на сцене имеется калаш, на котором прикреплен следующий скрипт: <br/> <pre><code class="cs">using UnityEngine;
using System.Collections;
using System.Collections.Generic;

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&lt;Animator&gt;();
    }

    void Update()
    {
        if (Input.GetButtonDown("Fire1") &amp;&amp; ammo &gt; 0 &amp;&amp; ammo != 0)
        {
            Shoot();
            NextTimeToFire = Time.time + 1f / FireRate;
            StartCoroutine(AmmoMinus());
        }

        if (Input.GetButton("Fire1"))
        {
            StopCoroutine(AmmoMinus());
        }

        if (Input.GetKey(KeyCode.R) &amp;&amp; ammo &lt; 30)
        {
            anim.SetBool("Reload", true);
        }
    }

    private IEnumerator AmmoMinus()
    {
        yield return new WaitForSeconds(0.2f);
        ammo -= 1;
    }

    private void Reload()
    {
        AmmoNeedToReload -= ammo;
        TotalAmmo -= AmmoNeedToReload;
        AmmoNeedToReload = 30;
        ammo = 30;
    }

    private void AnimToggle()
    {
        anim.SetBool("Reload", false);
    }


    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.tag == "box")
            {
            
  • 21 декабря 2024 г. 17:03
Ответы на вопрос 2
Чтобы реализовать счетчик оставшихся патронов для вашего автомата в 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` при
if (Input.GetButton("Fire1") && ammo > 0 && ammo != 0)
        {
            Shoot();
            NextTimeToFire = Time.time + 1f / FireRate;
            StartCoroutine(AmmoMinus());
        }


Ну так у вас скорострельность равна FPS по сути.
Добавляйте паузу между выстрелами - если с предыдущего выстрела прошло достаточно времени - делать следующий. Причем судя по NextTimeToFire попытки были - но переменная то в проверке не участвует
Похожие вопросы