Segunda sesión del taller de creación de videojuegos con Unity

En la segunda sesión del taller de creación de videojuegos con Unity configuramos el movimiento de la moto, preparamos los colisionadores (colliders) para las físicas, y añadimos los controles por teclado y pantalla táctil.

A continuación os dejamos el vídeo de la segunda sesión del taller:

Los dos scripts que utilizamos en el vídeo se muestran a continuación. También podéis hacer clic en los enlaces y descargarlos directamente. Descarga MotoFollower.cs.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MotoFollower : MonoBehaviour
{
public Transform moto; //Referencia a la transform de nuestra moto.

//Ejecutamos Update() una vez por frame.
void Update()
{
//Modificamos la posición de la transform de la cámara para que siga a la moto.
transform.position = moto.position – Vector3.forward * 10;
}
}

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MotoControl : MonoBehaviour
{
//Definimos tres variables que podemos modificar desde el editor
public float velocidadRotacion = 70; //La velocidad a la que rota la moto
public float velocidadLineal = 20; //La velocidad a la que se desplaza
public Transform ruedaTrasera; //Una referencia al objeto rueda trasera, localizado dentro de la moto, para utilizarlo como punto de rotación

//Definimos variables privadas
private Rigidbody2D rbody; //Referencia al rigidbody. Nos permite añadirle velocidad y mover la moto.
private float radioRueda; //Referencia al radio de la rueda.
private List acciones = new List(); //Listado con las acciones

public event eliminadoDelegate Eliminado;
public event triggerDelegate FinalNivel;
public delegate void eliminadoDelegate();
public delegate void triggerDelegate();

//Ejecutamos Start cuando se activa por primera vez el objeto en el juego.
void Start()
{
rbody = GetComponent(); //
radioRueda = GetComponent().radius + 0.1f; //Obtenemos el radio de la rueda a través del CircleCollider2D y le añadimos un offset de 0.1
}

//Función para desplazar la moto a la derecha
public void MueveDerecha()
{
if (TocaElSuelo())
{
rbody.velocity += new Vector2(transform.right.x * velocidadLineal, transform.right.y * velocidadLineal) * Time.deltaTime;
}
}

//Función para desplazar la moto a la izquierda
public void MueveIzquierda()
{
if (TocaElSuelo())
{
rbody.velocity -= new Vector2(transform.right.x * velocidadLineal, transform.right.y * velocidadLineal) * Time.deltaTime;
}
}

//Función para girar la moto levantando la rueda trasera
public void RotaDerecha()
{
rbody.MoveRotation(rbody.rotation – velocidadRotacion * Time.deltaTime);
}

//Función para girar la moto levantando la rueda delantera
public void RotaIzquierda()
{
rbody.MoveRotation(rbody.rotation + velocidadRotacion * Time.deltaTime);
}

//Ejecutamos Update() una vez por frame. Si el juego funciona a 24fps, se ejecutaría 24 veces por segundo.
void Update()
{
//Comprobamos si se está apretando alguna tecla del teclado
ActualizarAccionTeclado(KeyCode.LeftArrow);
ActualizarAccionTeclado(KeyCode.RightArrow);
ActualizarAccionTeclado(KeyCode.UpArrow);
ActualizarAccionTeclado(KeyCode.DownArrow);
//Comprobamos si la lista de acciones incluyen las diferentes teclas.
if (acciones.Contains(KeyCode.LeftArrow))
{
MueveIzquierda(); //Nos movemos a la izquierda
}
if (acciones.Contains(KeyCode.RightArrow))
{
MueveDerecha(); //Nos movemos a la derecha
}
if (acciones.Contains(KeyCode.UpArrow))
{
RotaIzquierda(); //Rotamos levantando la rueda delantera
}
if (acciones.Contains(KeyCode.DownArrow))
{
RotaDerecha(); //Rotamos levantando la rueda trasera
}
}

//Comprobamos si la tecla está siendo pulsada o si la hemos soltado
private void ActualizarAccionTeclado(KeyCode code)
{
if (Input.GetKeyDown(code))
{
ActualizarAccionDown(code); //Si la pulsamos
}
if (Input.GetKeyUp(code))
{
ActualizarAccionUp(code); //Si la soltamos
}
}

//Actualizar las acciones cuando pulsamos un botón táctil
private void ActualizarAccionDown(KeyCode code)
{
if (!acciones.Contains(code))
{
acciones.Add(code);
}
}
//Actualizar las acciones cuando soltamos un botón táctil
private void ActualizarAccionUp(KeyCode code)
{
if (acciones.Contains(code))
{
acciones.Remove(code);
}
}

//Funciones para asociar las acciones con los botones de la interfaz de usuario (táctiles)
public void MueveDerechaDown()
{
ActualizarAccionDown(KeyCode.RightArrow);
}
public void MueveIzquierdaDown()
{
ActualizarAccionDown(KeyCode.LeftArrow);
}
public void RotaIzquierdaDown()
{
ActualizarAccionDown(KeyCode.UpArrow);
}
public void RotaDerechaDown()
{
ActualizarAccionDown(KeyCode.DownArrow);
}
public void MueveDerechaUp()
{
ActualizarAccionUp(KeyCode.RightArrow);
}
public void MueveIzquierdaUp()
{
ActualizarAccionUp(KeyCode.LeftArrow);
}
public void RotaIzquierdaUp()
{
ActualizarAccionUp(KeyCode.UpArrow);
}
public void RotaDerechaUp()
{
ActualizarAccionUp(KeyCode.DownArrow);
}

/*
void OnTriggerEnter2D(Collider2D other)
{
if (other.gameObject.CompareTag(“Obstacle”) == true)
{
if (Eliminado != null)
{
Eliminado();
}
}
else if (other.gameObject.CompareTag(“Finish”) == true) {
if (FinalNivel != null) {
FinalNivel();
}
}
}
*/

//Función para comprobar si la moto toca el suelo o no.
bool TocaElSuelo()
{
if (Physics2D.OverlapCircleAll(ruedaTrasera.position, radioRueda).Length > 0)
{
return true;
}
else
{
return false;
}
}
}

¡Esperamos que os sea de ayuda! ¡Nos vemos en la próxima sesión!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Pin It on Pinterest

×