Jump to content

Archived

This topic is now archived and is closed to further replies.

Sabrewulf

ANSWERED Reiniciar una escena

Recommended Posts

Hola, estoy haciendo un Pong para ir familiarizándome con el código poco a poco (y con Unity)

 

Tengo esta variable para poder asignar desde Unity la tecla que quiero que haga el reinicio del juego:

public KeyCode reinicio;

En el código que le tengo asignado a la bola, dentro de la función void update() tengo una sentencia If para cada jugador que dice qué ocurrirá si éste gana la partida:

        if (p1score == 3) {
            winner.text = "PLAYER 1 WIN";
            winner.gameObject.SetActive(true);
            reset.text = "Pulsa 'Space' para comenzar de nuevo";
            reset.gameObject.SetActive(true);
            ResetBall(); //esta función hace que la bola vuelva a su posición inicial después de anotar un punto


Y por último, también dentro de la función update he añadido este trozo de código, que en principio debería reiniciar la escena:

         if (Input.GetKey(reinicio)) {
                SceneManager.LoadScene("PongMainScene");

 

Pero al pulsar la barra espaciadora, que es la tecla que tengo asignada, no ocurre absolutamente nada. He probado varias cosas, incluso pensé que era culpa de un Destroy que añadí que hacía que desapareciese la bola, pero tampoco.

¿Alguien sabría decirme dónde puede estar el problema?

 

Gracias de anteman y un saludo.

 

 

Share this post


Link to post
Share on other sites

asi de primeras no se....

has añadido la escena al build?

(abres "proyect/buildSettings" y "arrastras" la escena a la zona de arriba)

sino no se..... pon el script entero (el que contiene el loadScene).

 

Share this post


Link to post
Share on other sites

Gracias, he probado lo que dices pero sigue igual... medio día pegándome con esto, jeje.

Este es el código entero (lo tengo asignado a la bola, como ya comenté):

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SocialPlatforms.Impl;
using UnityEngine.UI;
using UnityEngine.Video;
using UnityEngine.SceneManagement;

public class Ball : MonoBehaviour
  
{
    int speedX;
    int speedY;
    float speed;

    public ParticleSystem sparks;
    public AudioClip Sonido = null;
    public float Volumen = 1.0f;

    protected Transform Posicion = null;

    public KeyCode reinicio;
  
	public Text reset;
    public Text winner;
    public Text scoreText;
  
    int p1score;
    int p2score;

    void Start(){

        MoveBall();

        Posicion = transform;
    }

    void Update()
    {
        scoreText.text = p1score.ToString () + " - " + p2score.ToString ();

        if (p1score == 3) {
            winner.text = "PLAYER 2 WIN";
            winner.gameObject.SetActive(true);
            reset.text = "Pulsa 'Space' para comenzar de nuevo";
            reset.gameObject.SetActive(true);
            ResetBall();
        }
         if (Input.GetKey(reinicio)) {
             SceneManager.LoadScene("PongMainScene");
        }
        
        if (p2score == 3) {
            winner.text = "PLAYER 1 WIN";
            winner.gameObject.SetActive(true);
            reset.text = "Pulsa 'Space' para comenzar de nuevo";
            reset.gameObject.SetActive(true);
            ResetBall();
        }
        if (Input.GetKey(reinicio)) {
            SceneManager.LoadScene("PongMainScene");
        }
    }
    void ResetBall() {

        transform.localPosition = new Vector3(0, 0, 0);
        GetComponent<Rigidbody>().velocity = Vector3.zero;
    }

    void MoveBall() {
      
        speed = Random.Range(2, 5);

        speedX = Random.Range(0, 2);
      
        if (speedX == 0) {
            speedX = 1;
        }
        else { speedX = -1;
        }

        speedY = Random.Range(0, 2);
      
        if (speedY == 0) {
            speedY = 1;
        }
        else { speedY = -1; 
        }
        GetComponent<Rigidbody>().velocity = new Vector3(speed * speedX, speed * speedY, 0);
    }

    void OnCollisionEnter(Collision objeto) {

        if (objeto.collider.tag=="player1goal") {
            p1score+=1;
            ResetBall();
            Invoke("MoveBall", 2);
        }
        if (objeto.collider.tag=="player2goal") {
            p2score += 1;
            ResetBall();
            Invoke("MoveBall", 2);

        }
        if (objeto.collider.tag == "Player") {
            sparks.Play();
        }
        if (Sonido) AudioSource.PlayClipAtPoint(Sonido, Posicion.position, Volumen);
    }
}

 

Share this post


Link to post
Share on other sites

echale un vistazo al enlace.estas usando un metodo obsoleto para cambiar de escena. Deberias usar:

Application.LoadLevel("PongMainScene")

https://docs.unity3d.com/es/530/ScriptReference/Application.LoadLevel.html

 

Espero que te sirva.

Un saludo

Share this post


Link to post
Share on other sites

¡Muchas gracias! me han funcionado las dos.

Aunque es curioso, porque la consola de Unity (utilizo la ver. 2019.2.5.f1) me dice que Application.LoadLevel está obsoleto... al igual que VS Community, cosa que no pasaba con SceneManager.LoadScene.

 

Por último, ocurre un mal menor y es que al reiniciarse la escena, la bola se reproduce automáticamente sin esperar los 2 segundos que se le indica en esta línea

Invoke("MoveBall", 2);

        

Share this post


Link to post
Share on other sites

Quizás podrías utilizar una Corrutina. Según la documentación oficial de Unity te recomienda su uso al de "Invoke(string,float)"
https://docs.unity3d.com/ScriptReference/MonoBehaviour.Invoke.html

Se haría de la siguiente forma:
 

//Primero. Crea la corrutina
IEnumerator Wait()
{
	yield return new WaitForSeconds(2);
}

 

//Segundo. Sustituye la corrutina en lugar de "Invoke(string ,float)"
if (objeto.collider.tag=="player1goal") {
            p1score+=1;
            ResetBall();
            StartCoroutine(Wait());
}
        
if (objeto.collider.tag=="player2goal") {
            p2score += 1;
            ResetBall();
            StartCoroutine(Wait());
}

 

Espero que pueda ayudarte.
Un saludo

Share this post


Link to post
Share on other sites

×
×
  • Create New...