c#得分计数器{Unity3D}
本文关键字:Unity3D 计数器 | 更新日期: 2023-09-27 18:15:51
我需要为我的游戏制作一个分数计数器。它部分有效,每当立方体达到(x)11时,分数就会上升,并且块将被重置到(x)12的起始位置。问题是,每当立方体到达(x)11时,它将继续计数+1,直到(x)12,当它被重置时,大多数时候得分约为36。它一直这样做,我不知道我做错了什么,全是菜鸟。下面是我的代码:
void Start () {
beginPositie = new Vector3 (-4, 0, 0);
transform.position = beginPositie;
score = 0;
}
void Update () {
snelheid = Random.Range (2, 5);
transform.Translate (snelheid * Time.deltaTime, 0, 0);
if(gameObject.transform.position.x>= 12){
transform.position = beginPositie;
}
}
void OnGUI() {
if (gameObject.transform.position.x == 11) {
score = score + 1;
}
GUI.skin = textSkin;
GUI.Label (new Rect (10, 10, 300, 100), "Score: " + score);
}
这是导致问题的原因:
if (gameObject.transform.position.x == 11)
不要将浮点数与=
进行比较,因为不能保证gameObject.transform.position.x
的值一定等于11
。
应该改成:
if (gameObject.transform.position.x >= 11)
另一个不相关的问题是OnGUI()
。不要用它。使用新的Unity UI
你有两个选择:如果你在这个循环中增加了分数,你可以存储在一个布尔值中,并在重置立方体位置时重置它:
bool countedThisCycle; // What you use to determine if you have scored this cycle.
void Start () {
beginPositie = new Vector3 (-4, 0, 0);
transform.position = beginPositie;
score = 0;
countedThisCycle = false; // Make sure you count the first one.
}
void Update () {
snelheid = Random.Range (2, 5);
transform.Translate (snelheid * Time.deltaTime, 0, 0);
if(gameObject.transform.position.x>= 12){
transform.position = beginPositie;
countedThisCycle = false; // Make sure you can count the next one.
}
}
void OnGUI() {
if (gameObject.transform.position.x == 11 && !countedThisCycle) { // Check that you haven't counted this one.
score = score + 1;
countedThisCycle = true; // Make sure you don't count it again.
}
GUI.skin = textSkin;
GUI.Label (new Rect (10, 10, 300, 100), "Score: " + score);
}
你的另一个选项,编程上更正确,是计数当你做重置,但这可能比计数当你达到11的目的。
即使你已经解决了你的问题,我想我可以帮助你了解哪里出了问题。
我们不知道update()
和OnGUI()
被调用的频率。OnGUI()
比Update()
更常被调用是很有道理的。这将使调用堆栈看起来像这样:
Update();
OnGUI();
OnGUI();
OnGUI();
OnGUI();
OnGUI();
Update();
OnGUI();
OnGUI();
OnGUI();
OnGUI();
OnGUI();
现在,如果你的Update()
重新计算并评估位置为11,你的OnGUI
将看到11并更新你的分数。因为OnGUI
被调用的次数更多,所以它会一直看到那个11。在我的例子中5次,导致你的分数连续提高5次,在下一次Update()
发生之前。
我的建议是将所有游戏逻辑都与游戏逻辑方法相关,并将所有UI相关的内容保留在UI相关方法中。不要把它们混在一起!