我正在使用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#。
答案 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
}
}
}