C#计分器{Unity3D}

时间:2016-11-02 10:07:04

标签: c# unity3d

我需要为我的比赛制作一个得分计数器。 它部分起作用,每当立方体达到(x)11时,分数上升,并且该块将被重置为它在(x)12处的开始位置。 问题是,无论何时立方体达到(x)11,它将继续计数+1直到(x)12,当它被重置时,得分大多数时间约为36。 它一直这样做,我不知道我做错了什么,完全在noobie这里。 这是我的代码:

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

}

3 个答案:

答案 0 :(得分:0)

你有两个选择:你可以存储一个布尔值,如果你已经增加了这个周期的得分,并在重置立方体位置时重置它:

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时的计数目的要好。

答案 1 :(得分:0)

这导致了问题:

if (gameObject.transform.position.x == 11)

不要将浮点数与=进行比较,因为永远无法保证gameObject.transform.position.x的值完全为11

那应该改为:

if (gameObject.transform.position.x >= 11)

另一个不相关的问题是OnGUI()。不要使用它。使用新的Unity UI

答案 2 :(得分:0)

即使您已经解决了问题,我想我可以帮助您了解问题所在。

我们不知道调用update()OnGUI()的频率。 OnGUI()Update()更频繁地被调用是非常合理的。这将使调用堆看起来像这样:

Update();
OnGUI();
OnGUI();
OnGUI();
OnGUI();
OnGUI();
Update();
OnGUI();
OnGUI();
OnGUI();
OnGUI();
OnGUI();

现在,如果您的Update()重新计算并评估排名为11,那么您的OnGUI将会看到11并更新您的分数。由于更频繁地调用OnGUI,因此在我的示例中会持续看到11. 5次,导致您的分数在下一个Update()发生之前连续提高5次。

我的建议是将所有与游戏逻辑方法相关的游戏逻辑与UI相关方法中的所有UI相关联。避免混合它们!