2016-11-02 22 views
0

私のゲームのスコアカウンターを作る必要があります。 キューブが(x)11に達するとスコアが上がり、ブロックは(x)12の開始位置にリセットされます。 問題は、立方体が(x)11に達するたびに、それがリセットされるときに、(x)12まで+1をカウントし続けるということです。スコアはほとんどの場合約36です。 それはこれを続けて、私はここでnoobieで完全に間違って何をしたのか分かりません。あなたは2つのオプションがありC#スコアカウンター{Unity3D}

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

} 
+0

'snelheid'は 'スピード'を意味します 'beginPositie'は 'startingPosition'を意味します – ShoarmaKarma

+0

11に達した時点でカウントを停止する必要があります。 – Programmer

+3

English StackOverflowで質問を投稿するときに英語の変数名を使用しようとします。また、NLで働く外国人として、ありがとう。 – JCabello

答えて

0

に到達したとき、それはおそらくカウントの目的を打つ:

gameObject.transform.position.xの値が正確に11であることが決して保証されないので、浮動小数点数を=と比較しないでください。別の無関係な問題はOnGUI()ある

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

:Bに変更する必要があり

。それを使用しないでください。新しいUnity UIを使用してください。

+0

ありがとう!しかし、私は別の方法を見つけた。 void OnGUIに+1/++スクリプト部分を作成する代わりに、「score ++;」を使用して、最後の行としてvoid Updateに置き換えました。これは問題を完全に解決しました。私は自分の問題を自分のやり方で解決しましたが、私はフロートを=と比較することもできないことを学びました= – ShoarmaKarma

+0

良い。だから、あなたは 'OnGUI()'を削除しますか? – Programmer

+0

いいえ、私は 'OnGUI()'を削除しませんでした。 'if(gameObject.transform.position。x == 11){ スコア=スコア+1; } ' 大量のコードではなく' score ++; ' の' update'に 'OnGui'というコードがあります。' 'GUI.skin = textSkin; GUI.Label(新しいRect(10、10、300、100)、 "Score:" + score); 'スコアカウンタが表示されます。 – ShoarmaKarma

0

: はここに私のコードで、あなたは得点はこのサイクルを増加している場合はブール値に格納し、キューブの位置resetingでそれをリセットすることができます。

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

0

あなたの問題を既に解決していても、何が問題になったのかを理解するのに役立つと思います。

update()OnGUI()がどれほど頻繁に呼び出されるかわかりません。 OnGUI()がより頻繁に呼び出され、Update()と呼ばれることは非常に蓋然性があります。このようなコールスタックを見て何か作ることになる:あなたのUpdate()再計算ならば今

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

を11に位置を評価し、あなたのOnGUIは11を参照し、あなたのスコアを更新します。 OnGUIがより頻繁に呼び出されるので、私の例では11回目を見続けることになるので、次のUpdate()が起こる前にスコアが5回上がります。

私のアドバイスは、ゲームロジックメソッドに関連するすべてのゲームロジックと、すべてのUI関連のUI関連メソッドを維持することです。それらを混ぜるのを避けてください!

+0

これは素晴らしいヒントで、C#の詳細を理解できました。 私は今からそれらを混ぜるのを避けようとしますが、私はC#のトータルな新人ですから、たぶん今でも毎回起こるでしょう。 ありがとうまだたくさん! :) – ShoarmaKarma