2017-01-26 2 views
1

私のプロジェクトでは、さまざまなオブジェクトを数え、小さなアニメーションをシミュレートしようとしています。たとえば、ゲームに星があり、0のトラフから試合の最後の星の数を数えたいとします。星の数ユーザーが得たので、私はこのでした:私のコードは秒間ループ待ちに0.3Fのためによく働いたが、それは私は0.2Fのためにそれをしたい、あまりにも遅いですが、何かCoroutineでオブジェクトを数える

public void youWin() 
    { 
     audio.Stop(); 
     StartCoroutine (activatePanel()); 
    } 

    IEnumerator activatePanel() 
    { 
     yield return new WaitForSeconds (3f); 
     pausePanel2.SetActive (true); 
     for (int i = 0; i <= stars; i++) { 
      yield return new WaitForSeconds (0.2f); 
      starText2.text = i + ""; 
     } 
    } 

を奇妙なことが時々起こる、それはバグのようになり、最初の数字は戻っているようだ、それは正しくカウントされません、誰かが何が起こっているのか知っていますか?

+1

に入りました"それは正しくカウントされません"、あなたはテキストが間違っていること、またはタイミングがずれていると感じていることを意味しますか? – Serlite

+0

うん、わかりませんが、私はあなたにそのようなことが起こる例を教えてください。{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 、18,19,20,11,21}この計算の終わりに、11に非常に速くなり、21になると、毎回実行します。 –

+1

おそらく、完了する前にyouWin()を何度も呼び出しているのでしょうか? – Infodayne

答えて

1

activatePanel関数がすでに実行中に別の場所から呼び出されている可能性があります。または、このコードを含むスクリプトが複数のGameObjectに関連付けられていて、activatePanelが再び別の関数によって呼び出されます。これを止めるためにフラグを使うことができます。

コルーチン関数が既に実行されている場合は、それを中止するにはyield break;を使用してください。

bool isRunning = false; 
IEnumerator activatePanel() 
{ 
    //Exit if already running 
    if (isRunning) 
    { 
     yield break; 
    } 

    //Not running, now set isRunning to true then run 
    isRunning = true; 

    yield return new WaitForSeconds(3f); 
    pausePanel2.SetActive(true); 

    WaitForSeconds waitTime = new WaitForSeconds(0.2f); 
    for (int i = 0; i <= stars; i++) 
    { 
     yield return waitTime; 
     starText2.text = i.ToString(); 
    } 

    //Done running, set isRunning to false 
    isRunning = false; 
} 
+0

私はアクティブパネルをちょうど1つのgameobjectに関連付けています。私はそれがすでに確認している問題ではないと思っています。秒の待ち時間が少し大きければ、それはうまくいくでしょう。 –

+0

それは唯一の可能性のある問題です。将来、 'for'ループで' Debug.Log'を使用してください。これは、将来、この種のバグを見つけるのに役立ちます。 – Programmer

+1

ええ、以下の腕時計、あなたは正しいです、非常にありがとうございます:D –

0

まあ、私はみんなが助けて、あなたのすべてでそれを解決し、実際にあなたがすべての権利、私はちょうど1時間youWin関数を呼び出したthaughtが、私は、これは団結で忘れてしまったと私はtrigerEnter内youWinと呼ばれますあなたがいることを言うとき、オブジェクトがここにあなたのすべてに感謝し、triger機能を入力してyouWin関数を呼び出しておくことを意味機能は、私はブール値でそれを解決している

と言いたいです

public class Victory : MonoBehaviour { 

Manager gameManager; 
// Use this for initialization 
public AudioClip clip; 
private AudioSource audio; 
public Animator girl; 
private bool entered; 


void OnTriggerEnter(Collider c) 
{ 
    if (c.gameObject.tag == "Player" && !entered) { 
     gameManager.win = true; 
     audio.clip = clip; 
     audio.Play(); 
     gameManager.Ball.GetComponent<MoveBall>().enabled = true; 
     girl.SetBool ("win",true); 
     entered = true; 
     gameManager.youWin(); 
    } 
} 

void Start() { 
    gameManager = GameObject.Find ("GameController").GetComponent<Manager>(); 
    audio = GetComponent<AudioSource>(); 
    entered = false; 

} 

// Update is called once per frame 
void Update() { 

} 
} 
関連する問題