计数器在应该减少1的情况下减少一半

本文关键字:情况下 少一半 计数器 | 更新日期: 2024-10-19 21:50:05

我正在Unity引擎中进行一个项目,遇到了一个我无法理解的问题。我有一个弹药计数器,每当玩家点击鼠标左键时,它会将可用弹药量减少1。然而,它并没有这样做,而是减少了一半(四舍五入)。我不完全确定为什么会发生这种情况,因为唯一递减的值是"ammonCount-=1;"我的脚本代码如下:

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class ShootGun : MonoBehaviour {
public Text Ammo;
public int ammoCount = 30;
void FixedUpdate ()
{
    if(Input.GetButtonDown("Fire1"))
    {
        for(int i = 1; i <= ammoCount; i++)
        {
            ammoCount -= 1;
            Debug.Log ("Ammo remaining: " + ammoCount);
            Ammo.text = " " + ammoCount;
            Vector3 gunRayOrigin = transform.position;
            float gunRayDistance = 50f;
            Ray gunRay = new Ray ();
            gunRay.origin = gunRayOrigin;
            gunRay.direction = Vector3.down;
            if(Physics.Raycast(gunRayOrigin, gunRay.direction, gunRayDistance)) {
                Debug.Log("Bullet Hit");
            }
        }
    }
}
}

任何帮助都将不胜感激,因为我仍在掌握C#的窍门。

计数器在应该减少1的情况下减少一半

您正在for循环中递减它。

如果我们简化为:

for(int i = 1; i <= ammoCount; i++)
{
     ammoCount -= 1;
}

并获得初始弹药计数6,当你第一次进入循环时:

i = 1, ammoCount = 6

但是你从弹药计数中减去一,循环加一到i。所以下一个循环你有

i = 2; ammoCount = 5

但是你从弹药计数中减去一,循环加一到i。所以下一个循环你有

i = 3; ammoCount = 4

但是你从弹药计数中减去一,循环加一到i。所以下一个循环你有

i = 4; ammoCount = 3

循环完成(因为现在i<=ammonCount不再为真)。弹药数量是原来的一半。

看起来像Input.GetButtonDown("Fire1")只有在按下并释放按钮时才会返回true,所以这是一个"按下按钮并发射所有弹药"的场景,而不是"发射直到弹药耗尽或释放钥匙"。

所以你想让它继续发射,而还有弹药(提示提示)。

您正在for循环中递减计数器。通过减少循环的上限并增加迭代变量i,基本上将上限(ammoCount)减半。

在这种情况下,我看不出为什么需要循环。

FixedUpdate是一个以固定间隔发生的事件,应该主要用于处理物理的场景。我不认为是这样(有些人可能会说你在使用光线投射,但我个人不确定这是否有效)。您想对用户按钮的按下做出反应,所以在我看来,您应该使用Update事件。

如果用户按下释放按钮,则GetButtonDown()返回true。相反,您应该使用GetButton()来了解按钮是否按下。如果是,继续开火,如果不是,什么也不做。否则,你必须反复按下按钮,这可能又不是你想要的行为。

现在让我们看看当你按下按钮时会发生什么。每次用户执行该操作时,您都会开始减少弹药数量,直到弹药数量为零。不确定你在创造什么样的游戏,但这听起来不对。相反,我所期望的是在用户按下按钮时减少while的计数。在更新事件中,只需检查弹药数量是否高于零,如果是,则进行光线投射检查是否命中。

它看起来是这样的:

void Update()
{
   if(Input.GetButton("Fire1"))
   {
       if (ammoCount > 0)
       {
           ammoCount--;
           // do raycast and so on
       }
   }
}