Sabrewulf 2 Report post Posted May 2, 2020 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
Igor 336 Report post Posted May 2, 2020 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
Sabrewulf 2 Report post Posted May 2, 2020 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
EnrMF 5 Report post Posted May 2, 2020 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 1 Share this post Link to post Share on other sites
iRobb 776 Report post Posted May 3, 2020 El mejor para cargar una scene, desde mi punto de vista, es: https://docs.unity3d.com/ScriptReference/SceneManagement.SceneManager.LoadSceneAsync.html LoadSceneAsync. Esto te permitirá cargar la scene de manera asíncrona y así podrás mostrar "algo". Además no bloquearás el proceso. 1 Share this post Link to post Share on other sites
Sabrewulf 2 Report post Posted May 3, 2020 ¡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
EnrMF 5 Report post Posted May 3, 2020 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