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!