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);
}

c#得分计数器{Unity3D}

这是导致问题的原因:

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相关方法中。不要把它们混在一起!