web-dev-qa-db-fra.com

Comment puis-je attendre 3 secondes, puis définir un booléen sur vrai, en C #?

Mon script/jeu/chose fait bouger un objet de jeu vers la droite et quand je clique sur la danse (un bouton que j'ai créé) il s'arrête. Ensuite, lorsque le compteur (je n'ai peut-être pas besoin d'un compteur mais je veux attendre 3 secondes) atteint 3 (une fois que vous avez cliqué sur danser, le compteur démarre), mon objet de jeu est supposé continuer en allant vers la droite.

Si vous pouvez corriger le code, ce serait cool. Si vous pouvez le corriger et m'expliquer ce que j'ai fait de mal, ce serait encore plus génial. Je viens de commencer à apprendre le C # sur 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;
    }
}
16
Froob

Vous pouvez le faire assez facilement avec des coroutines:

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 
 }

Voir http://docs.unity3d.com/Documentation/ScriptReference/index.Coroutines_26_Yield.html pour plus d'informations sur Coroutines et comment les utiliser. Ils sont assez soignés lorsqu'ils essaient de faire une série d'événements chronométrés.

15
Jan Thomä

Je pense que le moyen le plus simple est d'utiliser Invoke:

Invocation Unity3D

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

Je préfère utiliser StartCoroutine voici le lien: http://docs.unity3d.com/ScriptReference/MonoBehaviour.StartCoroutine.html

ex:

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

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

         // Code here will be executed after 3 secs
        //Do stuff here
    }
4
Basil Mariano

Faites d'abord contre un flotteur. Puis changez counter++; à counter += Time.deltaTime. Update () est appelé pour chaque trame donc le compteur sera 3 sur la troisième trame. Time.deltaTime vous donne le temps entre cette image et l'image précédente. Le résumer agit comme une minuterie.

3
Andrew Ngo