Como crear un infinite runner 2D con UNITY
Creamos el GameOver, GameManager, puntuaciones…
Ya tenemos nuestro sencillo juego más o menos acabado. Digamos que es funcional. Pero faltan todos aquellos detalles que lo convierten en un juego, lo completamos en esta lección.
Cualquier duda o comentario de la lección no dudeis en dejarla en el foro del curso.
Crearemos el GameManager, que es el script responsable de de manejar el juego y sus diferentes etapas.
Crearemos un par de Canvas, uno que mostrará la puntuación y la vida, y otro que será la pantalla de Game Over y nos permitirá reiniciar la partida con la pulsación de un botón.
También modificaremos el script del player para que hable con el GameManager. Lo hará llamando al objeto static que pertenece al gamenager, desde el que podrá acceder a sus funciones publicas.
Aquí tenemos un ejemplo de llamada a la función public GameOver del GameManager desde el script del Player:
if (_iHealth <= 0) { //En el caso de que la salud sea menor de 0: GameOver! GameManager.gm.GameOver(); _isAlive = false; Destroy(gameObject); }
Veamos como queda el script entero:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerController : MonoBehaviour { [SerializeField] private float _speed = 1f; //Velocidad a la que cambia de carril el caracter private Vector2 _targetPos; private int _maxHeight = 0; [SerializeField] private float _iHealth2Update = 0; //Variable que indica la variacion de salud en el tiempo. [SerializeField] private float _iHealth = 100, _iPoints = 0; [SerializeField] private Vector2[] _positionsAvailable; //Numero de carriles por los que se movera [SerializeField] private int _positionActual = 1; [SerializeField] private GameObject particleMove= null; //Sistema de particulas a lanzar al moverse private bool _isAlive; // Use this for initialization private void Awake() { //La posicion maxima es la longitud del array de posiciones. _maxHeight = _positionsAvailable.Length - 1; } void Start () { /*Invocamos la funcion de modificar la salud, solo si _iHealth2Update tiene algún valor informado. */ if (_iHealth2Update != 0) { InvokeRepeating("UpdateHealthRep", 1, 1); } _isAlive = true; //Informamos de la salud al GameManager para que modifique el canvas. GameManager.gm.UpdateHealthText(_iHealth); } void Update () { if (_iHealth <= 0) { //En el caso de que la salud sea menor de 0: GameOver! GameManager.gm.GameOver(); _isAlive = false; Destroy(gameObject); } else { //Si el player esta vivo movimiento. transform.position = Vector2.MoveTowards(transform.position, _targetPos, _speed * Time.deltaTime); if (Input.GetKeyDown(KeyCode.UpArrow) && (_positionActual < _maxHeight)) { //Si se pulsa la tecla arriba, cambiamos la targetPos por una mas grande del array. if (particleMove != null) { Instantiate(particleMove, transform.position, Quaternion.identity); } _positionActual += 1; _targetPos = _positionsAvailable[_positionActual]; } else if (Input.GetKeyDown(KeyCode.DownArrow) && (_positionActual > 0)) { //Si se pulsa la tecla abajo, cambiamos la targetPos por una mas pequeña del array. if (particleMove != null) { Instantiate(particleMove, transform.position, Quaternion.identity); } _positionActual -= 1; _targetPos = _positionsAvailable[_positionActual]; } } } public void UpdateHealth(float pHEalth2Update) { if (_isAlive) { _iHealth = _iHealth + pHEalth2Update; GameManager.gm.UpdateHealthText(_iHealth); } } private void UpdateHealthRep() { //Se encarga de ir modificando cada segundo la vida del player. if (_isAlive) { UpdateHealth(_iHealth2Update); } } public void UpdatePoints(float pPoints2Update) { if (_isAlive) { _iPoints = _iPoints + pPoints2Update; GameManager.gm.UpdatePointsText(_iPoints); } }