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