2016-07-30 175 views
0
public class green : MonoBehaviour 
{ 
    private AudioSource source; 
    public AudioClip sound; 
    static int result = 0; 

    void Start() 
    { 
     StartCoroutine("RoutineCheckInputAfter3Minutes"); 
     Debug.Log("a"); 
    } 

    IEnumerator RoutineCheckInputAfter3Minutes() 
    { 
     System.Random ran = new System.Random(); 
     int timeToWait = ran.Next(1, 50) * 1000; 
     Thread.Sleep(timeToWait); 

     source = this.gameObject.AddComponent<AudioSource>(); 
     source.clip = sound; 
     source.loop = true; 
     source.Play(); 

     System.Random r = new System.Random(); 
     result = r.Next(1, 4); 
     Debug.Log("d"); 

     yield return new WaitForSeconds(3f * 60f); 
     gm.life -= 1; 
     Debug.Log("z"); 
    } 

    public void Update() 
    { 
     if (result == 1 && gm.checka == true) 
     { 
      Debug.Log("e"); 
      StopCoroutine("RoutineCheckInputAfter3Minutes"); 
      gm.life += 1; 
      source.Stop(); 
      gm.checka = false; 
      Debug.Log("j"); 
     } 
     if (result == 2 && gm.checkb == true) 
     { 
      Debug.Log("f"); 

      StopCoroutine("RoutineCheckInputAfter3Minutes"); 
      gm.life += 1; 
      source.Stop(); 
      gm.checkb = false; 
      Debug.Log("z"); 
     } 
     else if (result == 3 && gm.checkc == true) 
     { 
      StopCoroutine("RoutineCheckInputAfter3Minutes"); 
      Debug.Log("g"); 
      gm.life += 1; 
      source.Stop(); 
      gm.checkc = false; 
      Debug.Log(gm.life); 
     } 
    } 
} 

有兩個問題用戶空的輸入檢查

  1. 我想要做音樂停止,生命可變減少-1,如果用戶未推動任何按鈕3分鐘。但是,如果用戶按下右鍵,生命變量將增加+ 1,但我不知道如何從用戶得到空輸入3分鐘。

  2. 如果我使用while這個程序,這將關閉&hellip;直到生命低於0,我想重複在不規則時間播放的音樂。

+0

是什麼'result'是什麼意思?什麼是'gm'?你如何決定這些'checka','checkb'和'checkc'?你應該給一個乾淨的代碼,並刪除它的不必要的部分。 –

+0

我以爲人們一下子就知道了;;;下一次,我會注意我; –

回答

1

編輯:不要在統一使用線程

How Unity works

Alternative to Thread

Couroutine Example 1

Coroutine Example 2

*簡單來說,Thread.Sleep掛在Unity上,Unity無法運行,這就是爲什麼它看起來像運行緩慢。

對於此問題,您可以使用協程

void Start() 
{ 
    StartCoroutine("RoutineCheckInputAfter3Minutes"); 
} 

IEnumerator RoutineCheckInputAfter3Minutes() 
{ 
    yield return new WaitForSeconds(3f*60f); 
    gm.life -= 1; 
} 

void RightButtonClicked() 
{ 
    gm.life += 1; 

    StopCoroutine("RoutineCheckInputAfter3Minutes"); 
    StartCoroutine("RoutineCheckInputAfter3Minutes"); 
} 

或者,你可以把你的a功能爲協程,如果其他代碼段的工作。

void Start() 
{ 
    StartCoroutine(a()); 
} 
public IEnumerator a() 
{ 
    while (gm.life >= 0) 
    { 
     System.Random ran = new System.Random(); 
     int timeToWait = ran.Next(1, 50) * 1000; 
     yield return new WaitForSeconds(timeToWait); 

     source = this.gameObject.AddComponent<AudioSource>(); 
     source.clip = sound; 
     source.loop = true; 
     source.Play(); 

     System.Random r = new System.Random(); 
     result = r.Next(1, 4); 
     Debug.Log("d"); 
    } 
} 

這是協程的一個例子使用基於你的代碼比這更是超出範圍:

A pastebin link to code

+0

routinecheckinputafter3minutes功能與右鍵點擊功能同時工作? –

+0

不,這只是一個幫手功能。您可以隨時撥打電話,例如點擊按鈕。 –

+0

謝謝!它運作良好...但它的工作停止在「Thread.Sleep(timeToWait); –