2016-07-30 10 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); 
     } 
    } 
} 

Es gibt zwei ProblemeBenutzer null Eingabeprüfung für einige Zeit und Faden

  1. Ich will Musik stoppen und Leben variable Rückgang um -1, wenn der Benutzer drückt keine Tasten für 3 Protokoll. Aber wenn der Benutzer den rechten Knopf drückt, wird die Lebensvariable + 1 erhöht. Aber ich weiß nicht, wie ich 3 Minuten lang eine Nulleingabe vom Benutzer erhalten kann.

  2. Wenn ich while für dieses Programm verwende, wird dies abgeschaltet & hellip; bis das leben unter 0 ist, möchte ich musik wiederholen, die in unregelmäßigen zeiten gespielt wird.

+0

Was bedeutet 'result' bedeuten? Was ist 'gm'? Wie entscheiden Sie sich für checka, checkb und checkc? Sie sollten einen sauberen Code eingeben und die unnötigen Teile davon entfernen. –

+0

Ich dachte, die Leute wüssten es sofort ;;; das nächste Mal werde ich meine Aufmerksamkeit schenken ;;; –

Antwort

1

Edit: Verwenden Sie Gewinde in Unity nicht

How Unity works

Alternative to Thread

Couroutine Example 1

Coroutine Example 2

* Um es einfach zu sagen, Thread.Sleep hängt an Unity und Unity kann für die Zeit nicht funktionieren, und deshalb sieht es so aus, als würde man langsam laufen.

Sie können Korotinen für dieses Problem verwenden.

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

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

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

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

Oder können Sie einfach schalten Sie a Funktion in eine Koroutine, wenn die anderen Codeabschnitten arbeiten.

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

Dies ist ein Beispiel für die Verwendung von Koroutine basierend auf Ihren Code Mehr als das ist außerhalb des Gültigkeitsbereichs:

A pastebin link to code

+0

routinecheckinputafter3minutes funktion funktioniert mit rightbuttonclicked funktion zur gleichen zeit? –

+0

Nein. Es ist nur eine Hilfsfunktion. Sie können es jederzeit aufrufen, zum Beispiel mit einem Klick auf die Schaltfläche. –

+0

danke! es funktioniert gut ... aber es funktioniert halt bei "Thread.Sleep (timeToWait); –