Como crear un infinite runner 2D con UNITY
Creando el protagonista con GIMP para UNITY
Usando la técnica de animación por sprites crearemos un protagonista para nuestro juego. Vamos a crear dos animaciones, lo que serán unas seis imágenes en total que vamos a importar a UNITY.
Cualquier duda o comentario de la lección no dudeis en dejarla en el foro del curso.
El script que creamos para controlar al player:
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;
}
// Update is called once per frame
void Update ()
{
if (_iHealth <= 0)
{
//En el caso de que la salud sea menor de 0: 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];
}
}
}
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);
}
}
}