когда я нажимаю 1 раз, unity регистрирует 2 клика вместо 1;

#c# #unity3d

Вопрос:

у меня есть скрипт пистолета, всякий раз, когда я нажимаю, мои боеприпасы должны уменьшаться на 1, но иногда я нажимаю один раз, и unity уменьшается на 2, я сначала попробовал ammo--; , потом попробовал ammo -= 1 , но это то же самое:

это сценарий:

 using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Gun : MonoBehaviour
{
    [Header("Gun Raycast Things")]
    [SerializeField] private Transform raycastPos;
    [SerializeField] private float gunRange = 50f;

    [Header("Particles")]
    [SerializeField] private ParticleSystem particleSystem;

    [Header("Ammo")]
    [SerializeField] private float ammo = 30f;
    [SerializeField] private GameObject reloadAnim;

    public float gunDamage = 20f;

    void Update()
    {
        if (Input.GetKey(KeyCode.R) amp;amp; ammo != 30)
        {
            reload();
        }
    }
    void FixedUpdate()
    {
        if(Input.GetButtonDown("Fire1"))
        {
            Shoot();
        }
    }

    private void Shoot()
    {
        if (ammo <= 0)
        {
            return;
        }
        ammo -= 1;

        RaycastHit hit;

        if(Physics.Raycast(raycastPos.transform.position, raycastPos.transform.forward, out hit, gunRange))
        {
            Debug.Log(hit.collider.tag);
            Debug.DrawLine(raycastPos.transform.position, hit.point);

            Target target = hit.transform.GetComponent<Target>();
            if(target != null)
            {
                target.OnHit(gunDamage);
            }

        }

        particleSystem.Play();
        Debug.Log(ammo);
    }

    private void reload()
    {
        reloadAnim.GetComponent<Animator>().Play("GunReloadAnimation");
        ammo = 30f;
    }
}
 

Комментарии:

1. firstly tried ammo--; then i tried ammo -= 1 but its the same .. это действительно точно то же самое ^^

2. добавьте флаг bool, чтобы предотвратить дублирование записей при обработке съемки. Т. е.: частная съемка пустоты() { работает = true) и по вызову: если(Ввод. GetButtonDown(«Пожар 1»)) { если (!работает){ Shoot(); } }

3. @joreldraw как это предотвратит повторное выполнение всего этого? 😉 Если вы все равно сбросите флаг внутри самого метода, то в следующий раз его можно будет вызвать снова

Ответ №1:

В общем, скорее получите пользовательский ввод Update , а не в FixedUpdate !

Вы можете пропустить ввод или, если у вас более низкая частота кадров FixedUpdate , вас могут вызвать дважды за кадр.

Видеть FixedUpdate

Частота обновления FixedUpdate больше или меньше, чем обновление. Если приложение работает со скоростью 25 кадров в секунду (кадров в секунду), Unity вызывает его примерно дважды за кадр, в качестве альтернативы, 100 кадров в секунду вызывают примерно два кадра рендеринга с одним исправленным обновлением.

Так что это полностью зависит от вашей частоты кадров и физических настроек.

Как уже было сказано в целом, вы должны скорее получить кадр ввода пользователем одного события:

 void Update()
{
    // you might want to consider to also here use GetKeyDown depending on your desired gameplay
    if (Input.GetKey(KeyCode.R) amp;amp; ammo != 30)
    {
        reload();
    }

    if(Input.GetButtonDown("Fire1"))
    {
        Shoot();
    }
}
 

Комментарии:

1. я постараюсь, я думаю, что в этом проблема, так как у меня компьютер с более низкой спецификацией, но я посмотрю, спасибо.