Jump to content
rayser

Realizar una acción tras x segundos

Recommended Posts

Me encuentro bloqueado a la hora de ejecutar acciones tras un determinado tiempo. En este caso querría cambiar de escena tras cinco segundos de haber finalizado la partida, pero me ocurren varios problemas. Si pongo la velocidad a cero para que la bola no se mueva, desaparece el objeto por lo que desaparece el script y no llama a la siguiente escena. Y probando con la función Time.timeScale no parece hacer nada.

Me gustaría saber la forma correcta de pausar el juego para después llamar a una función después de un tiempo específico.

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using System.Threading;
using UnityEngine.SceneManagement;

public class Ball : MonoBehaviour {

    public float speed = 15;
    public int scoreFinal = 5;
    public Text scoreLeft;
    public Text scoreRight;
    public Text resultFinal;
    public int segundosAumentarVelocidad = 10;

    public AudioSource[] AudioClips = null;

    private float contadorSegundos = ;

    // Use this for initialization
    void Start ()
    {
        AudioClips = GetComponents<AudioSource>();
        GetComponent<Rigidbody2D>().velocity = Vector2.right * speed;
    }

    void FixedUpdate()
    {
        contadorSegundos += Time.smoothDeltaTime;

        //Aumentar la velocidad de la bola cada x segundos
        if(contadorSegundos >= segundosAumentarVelocidad)
        {
            speed = speed + 1;
            contadorSegundos = ;
        }
    }

    void OnCollisionEnter2D(Collision2D col)
    {
        //Golpea la pala izquierda
        if(col.gameObject.name == "RacketLeft")
        {
            //Se calcula el hitFactor
            float y = hitFactor(transform.position, col.transform.position, col.collider.bounds.size.y);

            //Calcular dirección
            Vector2 dir = new Vector2(1, y).normalized;

            //Asignar velocidad
            GetComponent<Rigidbody2D>().velocity = dir * speed;

            //Activar sonido
            //sonidoPala.Play();
            AudioClips[].Play();
        }

        //Golpea la pala derecha
        if (col.gameObject.name == "RacketRight")
        {
            //Se calcula el hitFactor
            float y = hitFactor(transform.position, col.transform.position, col.collider.bounds.size.y);

            //Calcular dirección
            Vector2 dir = new Vector2(-1, y).normalized;

            //Asignar velocidad
            GetComponent<Rigidbody2D>().velocity = dir * speed;

            //Activar sonido
            //sonidoPala.Play();
            AudioClips[].Play();
        }

        //Golpea las paredes arriba y abajo
        if (col.gameObject.name == "WallTop" || col.gameObject.name == "WallBottom")
        {
            //Activar sonido
            //sonidoPared.Play();
            AudioClips[1].Play();
        }

        //Golpea las paredes izquierda y derecha
        if (col.gameObject.name == "WallLeft" || col.gameObject.name == "WallRight")
        {
            //Activar sonido
            //sonidoPared.Play();
            AudioClips[2].Play();

            //Sumar puntos
            if(col.gameObject.name == "WallLeft")
            {
                scoreRight.text = (int.Parse(scoreRight.text) + 1).ToString();

                if(int.Parse(scoreRight.text) == scoreFinal)
                {
                    resultFinal.text = "El jugador " + 2 + " ha ganado";
                    //GetComponent<Rigidbody2D>().velocity = Vector2.right * 0;
                    //speed = 0;
                    Time.timeScale = ;

                    //Al pasar cinco segundos salta a la escena de créditos
                    //StartCoroutine(cambiarEscena());
                    //Invoke("cambiarEscena", 0.5f);
                    Invoke("cambiarEscena", 5);
                }
            }
            else
            {
                scoreLeft.text = (int.Parse(scoreLeft.text) + 1).ToString();

                if(int.Parse(scoreLeft.text) == scoreFinal)
                {
                    resultFinal.text = "El jugador " + 1 + " ha ganado";
                    //GetComponent<Rigidbody2D>().velocity = Vector2.right * 0;
                    //speed = 0;
                    Time.timeScale = ;

                    //Al pasar cinco segundos salta a la escena de créditos
                    //StartCoroutine(cambiarEscena());
                    //Invoke("cambiarEscena", 0.5f);
                    Invoke("cambiarEscena", 5);
                }
            }
        }
    }

    float hitFactor(Vector2 ballPos, Vector2 racketPos, float racketHeight)
    {
        return (ballPos.y - racketPos.y) / racketHeight;
    }

    /*private IEnumerator cambiarEscena()
    {
        Debug.Log("pr");
        yield return new WaitForSeconds(5);
        Debug.Log("pr2");
        SceneManager.LoadScene("Credits");
    }*/

    void cambiarEscena()
    {
        Debug.Log("pr");
        SceneManager.LoadScene("Credits");
    }
}

 

Share this post


Link to post
Share on other sites

Hola!!!

Te puedo ayudar mas o menos :)

Lo que debes de hacer es crear un temporizador:

Cita

 

public float tiempodesaparecer;

void Update(){

tiempoDesaparecer = tiempoDesaparecer - 1 * Time.deltaTime;

}

 

Colocas que esa accion se ejecute cuando termine el juego, y antes de eso debes poner que se pause el juego:

Cita

Time.timeScale = 0;

Puesto que con esto paras el juego pero no los scripts (creo)

Osea que cuando termines el juego lo pause, luego colocas que si esta pausado entonces pase lo del tiempo y si el tiempo es igual a 0 entonces pasa la escena.

Quedando mas o menos asi:

Cita

 

public float tiempodesaparecer;

//Termina el Juego

Time.timeScale = 0;

if(Time.timeScale == 0){

tiempoDesaparecer = tiempoDesaparecer - 1 * Time.deltaTime;

}

if(tiempoDesaparecer == 0){

//Cambia la escena

}

 

Espero que te ayude.

Chau.

Posdata: No copies el texto que puse, tiene errores de redaccion porque las variables no concuerdan, tu solo hazlo deacuerdo lo que necesites.Es decir,el codigo sirve,pero no lo copies alcaletra porque asi no sirve, crealo desde cero referenciandote de mi codigo :)

 

Edited by pioj
uso de tags y <> para pegar código.

Share this post


Link to post
Share on other sites

UnitySpain © Todos los derechos reservados 2020
×
×
  • Create New...