当它减少1时,计数器减半

时间:2015-03-05 21:23:46

标签: c# unity3d

我正在使用Unity引擎中的某个项目,但我遇到了一个我无法理解的问题。我有一个弹药计数器,每次玩家点击鼠标左键时,可以减少1的弹药数量。不过这样做,它减少了一半(向下舍入)。我不完全确定为什么会发生这种情况,因为唯一的减值值是" ammoCount - = 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#。

3 个答案:

答案 0 :(得分:3)

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

在这种情况下,我认为没有理由需要循环。

答案 1 :(得分:3)

你在for循环中递减它。

如果我们简化到这个:

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

并将初始ammoCount设为6,第一次进入循环时:

i = 1, ammoCount = 6

但是你从ammoCount中减去一个,然后循环向i添加一个。所以你有下一个循环

i = 2; ammoCount = 5

但是你从ammoCount中减去一个,然后循环向i添加一个。所以你有下一个循环

i = 3; ammoCount = 4

但是你从ammoCount中减去一个,然后循环向i添加一个。所以你有下一个循环

i = 4; ammoCount = 3

循环完成(因为现在我&lt; = ammoCount不再为真)。 ammoCount是它的一半。

看起来Input.GetButtonDown("Fire1")仅在按下并释放按钮时返回true,因此这是“按下按钮并触发所有弹药”场景,而不是“直到弹药出来或关键是释放”。

所以你希望它继续射击还有任何弹药(提示提示)。

答案 2 :(得分:2)

FixedUpdate是在固定间隔内发生的事件,主要用于处理物理时的场景。我不认为是这种情况(有些人可能会说你正在使用光线投射,但如果重要的话,我不确定我个人)。你想按下用户按钮做出反应,所以在我看来你应该使用Update事件。

如果用户按释放按钮,

GetButtonDown()将返回true。你应该做的是使用GetButton()来知道按钮是否被按下。如果是的话,继续射击,如果没有,则什么也不做。否则你必须反复按下按钮,这可能不是所希望的行为。

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

看起来像这样:

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