Как я могу щелкнуть правой кнопкой мыши, чтобы стрелять автоматически, и при повторном нажатии левой кнопки мыши он будет стрелять по одному при каждом щелчке левой кнопкой мыши?

#c# #unity3d

#c# #unity3d

Вопрос:

Я хочу иметь возможность переключаться между щелчками левой кнопки мыши для одиночных снимков, и как только один щелчок правой кнопкой мыши будет стрелять автоматически, никто не остановится, пока снова не нажмет левую кнопку мыши. И переменная automaticFire bool бесполезна, поскольку я говорю о после создания игры не в редакторе.

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

public class Shooting : MonoBehaviour
{
    [SerializeField]
    private Transform[] firePoints;
    [SerializeField]
    private Rigidbody projectilePrefab;
    [SerializeField]
    private float launchForce = 700f;
    [SerializeField]
    private Animator anim;
    [SerializeField]
    private bool automaticFire = false;
    [SerializeField]
    private bool slowDownEffect = false;

    private void Start()
    {
        anim.SetBool("Shooting", true);
    }

    public void Update()
    {
        if (isAnimationStatePlaying(anim, 0, "AIMING") == true)
        {
            if (Input.GetButtonDown("Fire1") amp;amp; automaticFire == false)
            {
                if (anim.GetBool("Shooting") == true)
                {
                    anim.Play("SHOOTING");
                    LaunchProjectile();
                }
            }
            else
            {
                if (/*automaticFire == true amp;amp;*/Input.GetButtonDown("Fire2"))
                {
                    anim.Play("SHOOTING");
                    LaunchProjectile();
                }
            }
        }
    }

    private void LaunchProjectile()
    {
        foreach (var firePoint in firePoints)
        {
            Rigidbody projectileInstance = Instantiate(
                projectilePrefab,
                firePoint.position,
                firePoint.rotation);

            projectileInstance.AddForce(new Vector3(0, 0, 1) * launchForce);

            projectileInstance.gameObject.AddComponent<BulletDestruction>().Init();
        }
    }

    bool isAnimationStatePlaying(Animator anim, int animLayer, string stateName)
    {
        if (anim.GetCurrentAnimatorStateInfo(animLayer).IsName(stateName))
            return true;
        else
            return false;
    }
}
  

Я пытался :

 if (/*automaticFire == true amp;amp;*/Input.GetButtonDown("Fire2"))
                {
                    anim.Play("SHOOTING");
                    LaunchProjectile();
                }
  

Но это будет делать одиночные снимки при каждом нажатии правой кнопки мыши.
И я хочу, чтобы один щелчок правой кнопкой мыши автоматически не останавливался, а щелчок левой кнопкой мыши переключался на одиночные снимки.

Ответ №1:

Вы можете попробовать сделать что-то вроде этого:

 class Foo : MonoBehaviour 
{
    [SerializableField]
    private bool shooting = false;
    [SerializableField]
    private Animator anim;

    public void Update() 
    {
        if (shooting)
        {
            //if the shooting variable is set to true on the if below, it will start shooting
            anim.Play("Shooting");
            LaunchProjectile();
        }

        if (!shooting amp;amp; Input.GetButtonDown("Fire1"))
        {
            anim.Play("Shooting");
            LaunchProjectile();
        }
        else if (Input.GetButtonDown("Fire2"))
        {
            //reversing the shooting variable
            shooting = !shooting;
            if (shooting)
            {
                //this is just to make sure it will shoot right away
                //and not on the next frame
                anim.Play("Shooting");
                LaunchProjectile();
            }
        }
    }
}
  

Ответ №2:

вы можете использовать флаг, поэтому, когда вы нажимаете правую кнопку мыши, установите флаг true, воспроизведите анимацию и запустите снаряд.

Измененный код

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

public class Shooting : MonoBehaviour
{
    [SerializeField]
    private Transform[] firePoints;
    [SerializeField]
    private Rigidbody projectilePrefab;
    [SerializeField]
    private float launchForce = 700f;
    [SerializeField]
    private Animator anim;
    [SerializeField]
    private bool automaticFire = false;
    [SerializeField]
    private bool slowDownEffect = false;

    private void Start()
    {
        anim.SetBool("Shooting", true);
    }

    public void Update()
    {
        if (isAnimationStatePlaying(anim, 0, "AIMING") == true)
        {
            if (Input.GetButtonDown("Fire1") amp;amp; automaticFire == false)
            {
                if (anim.GetBool("Shooting") == true)
                {
                    anim.Play("SHOOTING");
                    LaunchProjectile();
                }
            }else if(Input.GetButtonDown("Fire1") amp;amp; automaticFire == true){
              automaticFire = true;
            }
            else
            {
                if (/*automaticFire == true amp;amp;*/Input.GetButtonDown("Fire2"))
                {
                    automaticFire = true;
                }
                if (automaticFire == true )
                {
                    anim.Play("SHOOTING");
                    LaunchProjectile();
                }
            }
        }
    }

    private void LaunchProjectile()
    {
        foreach (var firePoint in firePoints)
        {
            Rigidbody projectileInstance = Instantiate(
                projectilePrefab,
                firePoint.position,
                firePoint.rotation);

            projectileInstance.AddForce(new Vector3(0, 0, 1) * launchForce);

            projectileInstance.gameObject.AddComponent<BulletDestruction>().Init();
        }
    }

    bool isAnimationStatePlaying(Animator anim, int animLayer, string stateName)
    {
        if (anim.GetCurrentAnimatorStateInfo(animLayer).IsName(stateName))
            return true;
        else
            return false;
    }
}
  

если это поможет рассмотреть вопрос о повышении и принятии ответа.

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

1. Сначала я изменил внутри этой проверки automaticFire на false, либо он не работает, если это правда: else if (Ввод. GetButtonDown(«Fire1») amp;amp; automaticFire == true) { automaticFire = false; } Вторая проблема, когда он включен автоматически, мне нужно много раз нажимать левую кнопку мыши, пока она не вернется к одиночным выстрелам. Я думаю, проблема в том, что я жду окончания анимации в этой строке: if (isAnimationStatePlaying(anim, 0, «AIMING») == true) и с тех пор, когда он включен автоматически, щелчок левой кнопкой мыши не работает все время.

2. Я должен поймать его, когда анимация больше не воспроизводится.

3. Причина в том, что я жду окончания анимации, заключается в том, что я хочу, чтобы она включала стрельбу только при прицеливании.