#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. Причина в том, что я жду окончания анимации, заключается в том, что я хочу, чтобы она включала стрельбу только при прицеливании.