2013-06-05 21 views
12

Il mio script/gioco/cosa fare una mossa gameobject a destra e quando clicco danza (un pulsante ho creato) si ferma. Poi quando il contatore (forse non ho bisogno di un contatore ma voglio aspettare 3 secondi) arriva come 3 (una volta che si fa clic su Dance, il contatore inizia) il mio gameobject suppone di continuare andando a destra.Come posso aspettare 3 secondi e quindi impostare un valore bool su true, in C#?

Se è possibile correggere il codice che sarebbe cool. Se riesci a correggerlo e spiegami cosa ho sbagliato, sarebbe ancora più fantastico. Ho appena iniziato a imparare C# su Unity.

using System; 
using UnityEngine; 
using System.Collections; 

public class HeroMouvement : MonoBehaviour 
{ 
    public bool trigger = true; 
    public int counter = 0; 
    public bool timer = false; 

    // Use this for initialization 

    void Start() 
    { 
    } 

    // Update is called once per frame 

    void Update() 
    { //timer becomes true so i can inc the counter 

     if (timer == true) 
     { 
      counter++; 
     } 

     if (counter >= 3) 
     { 
      MoveHero();//goes to the function moveHero 
     } 

     if (trigger == true) 
      transform.Translate(Vector3.right * Time.deltaTime); //This moves the GameObject to the right 
    } 

    //The button you click to dance 
    void OnGUI() 
    { 
     if (GUI.Button(new Rect(10, 10, 50, 50), "Dance")) 
     { 
      trigger = false; 
      timer = true;//now that the timer is set a true once you click it,The uptade should see that its true and start the counter then the counter once it reaches 3 it goes to the MoveHero function  
     } 
    } 

    void MoveHero() 
    { //Set the trigger at true so the gameobject can move to the right,the timer is at false and then the counter is reseted at 0. 
     trigger = true; 
     timer = false; 
     counter = 0; 
    } 
} 
+4

Hai bisogno di andare piano con lo spazio bianco ... – paddy

+0

sì, potrebbe aver avuto 1/5 delle linee! – ApolloSoftware

+0

deve essere pagata in klocs :) – ApolloSoftware

risposta

3

Prima fare contatore un galleggiante. Quindi modificare counter++; a counter += Time.deltaTime. L'aggiornamento() viene chiamato per ogni fotogramma, quindi il contatore sarà 3 sul terzo fotogramma. Time.deltaTime ti dà il tempo tra questo frame e il frame precedente. Sommandolo funziona come un timer.

+0

Grazie malato provare che fuori – Froob

-7

se avete bisogno solo aspettare, è possibile utilizzare il metodo di sonno di Discussione

System.Threading.Thread.Sleep(3000); 
+2

Questo si blocca il ciclo di aggiornamento. Non dovresti aspettare nel ciclo di aggiornamento usando il thread sleep. –

+0

La mancata sospensione del thread non è una buona soluzione a questo problema. @ JanThomä è corretto. – SlxS

+0

Questo codice bloccherà il thread principale. Non farlo. –

14

Si potrebbe fare abbastanza facilmente con coroutine:

void Update() 
{ 
    if (trigger == true) 
     transform.Translate(Vector3.right * Time.deltaTime); //This moves the GameObject to the right 
} 

void OnGUI() 
    { 
     if (GUI.Button(new Rect(10, 10, 50, 50), "Dance")) 
     { 
      StartCoroutine(DoTheDance()); 
     } 
    } 


public IEnumerator DoTheDance() { 
    trigger = false; 
    yield return new WaitForSeconds(3f); // waits 3 seconds 
    trigger = true; // will make the update method pick up 
} 

Vedi http://docs.unity3d.com/Documentation/ScriptReference/index.Coroutines_26_Yield.html per ulteriori informazioni su coroutine e come usali. Sono abbastanza ordinate quando provano a fare una serie di eventi a tempo.

+0

mi serviva la linea di partenza coroutine da scrivere in questo modo per farlo funzionare in Unity 5: StartCoroutine (DoTheDance()); – skribbz14

+1

Grazie, ho aggiornato il codice. –

2

Io preferisco usare StartCoroutine ecco il link: http://docs.unity3d.com/ScriptReference/MonoBehaviour.StartCoroutine.html

es:

void Foo() { StartCoroutine (Begin()); } 

    IEnumerator Begin() 
    { 
     yield return new WaitForSeconds (3); 

     // Code here will be executed after 3 secs 
     //Do stuff here 
    } 
+0

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte al solo collegamento possono diventare non valide se la pagina collegata cambia. – Ghost

+0

Grazie Fantasma! :) Ho appena modificato i miei ans. –

-2

userei questo se il multi-threading:

DateTime a = DateTime.Now; 
    DateTime b = DateTime.Now.AddSeconds(2); 

    while (a < b) 
    { 
     a = DateTime.Now; 
    } 

    bool = x; 
+0

Rientra il tuo codice. – gsamaras

+1

Questo farà girare il filo ... cercare alternative !! – hooby3dfx

7

Penso che il modo più semplice modo è usare Invoke:

Unity3D Invoke

if (timer == true) Invoke("MoveHero", 3);

Problemi correlati