Videojuego de carreras en Unity3D

Contactar con el profesor

Ponemos la imágen de fondo

Ponemos un player en pantalla

Lo pondremos con su correspondiente animación.

Juego carreras con Unity 3D

El jugador avanza hacia delante

No queremos el el player caiga por gravedad, así que, para su componente RigidBody2D:

  • Cambiamos la propiedad Gravity Scale a 0.
  • Definimos la propiedad Constraints -> Freeze Rotation: 0.
void Update(){
	rb.velocity = transform.right * speed;
}

Girar al jugador con el teclado

Time.deltaTime ejecuta el cambio especificado en el tiempo concreto de un segundo.

transform.Rotate gira el objeto los grados especificados, mientras que transform.rotation establece el valor del transform sin tener en cuenta su rotación anterior.

void Update() {
	if (Input.GetKey(KeyCode.A)){
		transform.Rotate(0,0,90 * Time.deltaTime);
	}if (Input.GetKey(KeyCode.D)){	
		transform.Rotate(0, 0, -90 * Time.deltaTime);
	}
	rb.velocity = transform.right * speed;
}

No queremos que en el siguiente paso el decorado dote de un impulso giratorio al prota, por lo que tenemos dos opciones:

  • Aumentar mucho el Angular Drag
  • Marcar la check de Freeze Rotation.

Colisión con decorado

Puesto que el decorado de este juego tiene formas muy irregulares, le asignaremos un Polygon Collider 2D, que automáticamente detectará las zonas transparentes del sprite para definir el area colisionable.

Añadimos cuatro jugadores

Consideraciones:

  • Duplicamos el Game Object del jugador que ya está insertado para obtener los Game Object de los otros tres jugadores. Debemos definir una nueva animation y un nuevo animator por cada jugador.
  • Al hacer la animación tener en cuenta que las animaciones cíclicas, deben empezar y terminar por el mismo frame.
  • Para poder añadir una animación a un objeto, es necesario que el objeto esté seleccionado en el panel de jerarquía.
  • Finalmente, el código asociado a cada player, quedaría así:
public class Player : MonoBehaviour{
    float speed = -2;
    private Rigidbody2D rb;

    public KeyCode keycodeLeft;
    public KeyCode keycodeRight;
    private Animator animator;

	void Start(){
        rb = GetComponent<Rigidbody2D>();
        animator = GetComponent<Animator>();
    }

    void Update() {
        if (Input.GetKey(keycodeLeft)){
            Debug.Log("gira");
            transform.Rotate(0,0,90 * Time.deltaTime);
        }
        if (Input.GetKey(keycodeRight)){
            transform.Rotate(0, 0, -90 * Time.deltaTime);
        }
        rb.velocity = transform.right * speed;
    }
}

Colocar marcador

Para cada jugador añadimos dos objetos de tipo TextMeshPro. Uno que identificará al jugador y otro para su marcador. Tener en cuenta que serán objetos de tipo 3D.

Videojuego de carreras en Unity3D 1

Para evitar que el marcador se posicione detrás de alguno de los objetos de decorado ya situados en escena, en este caso no podremos cambiar su Order in Layer puesto que es un objeto de tipo 3D. Lo que debemos hacer es asegurarnos que el Order in Layer del resto de los objetos sea negativo, ya que el Order in Layer de un objeto 3D es cero.

Detectar paso por la línea de meta

Debemos detectar la colisión entre cualquiera de los jugadores y un empty con un BoxCollider2D. Para evitar la detección de la colisión entre los jugadores y cualquier objeto del decorado, etiquetaremos a la meta como Finish y en el código que gestiona la colisión evaluaremos esa etiqueta:

etiquetado unity 3d
void OnTriggerEnter2D(Collider2D col){
	if(col.gameObject.tag == "Finish"){
		Debug.Log("ha pasado un player");
	}
}

Evitar que los jugadores hagan trampas

markers en juego carreras de Unity 3d
void OnTriggerEnter2D(Collider2D col){
	if (col.gameObject.name == "marker1" && marker == 0){
		marker++;
	}else if (col.gameObject.name == "marker2" && marker == 1){
		marker++;
	}else if (col.gameObject.name == "marker3" && marker == 2){
		marker++;
	}else if (col.gameObject.name == "marker4" && marker == 3){
		marker++;
	}else if (col.gameObject.tag == "Finish" && marker == 4){
		marker = 0;
		Debug.Log("Un player ha dado una vuelta");
	}
}

Podría darse el caso de que un jugador atravesase varias veces seguidas la línea de meta sin completar la vuelta. Para evitar esto, colocaremos en pantalla varios BoxCollider2D el el check isTrigger activado. La idea es que el jugador debe pasar por cada uno de estos BoxCollider2D antes de pasar por la línea de meta.

Aumentar el contador de vueltas

public TextMeshPro marcadorAsociado;
...
marcadorAsociado.text = ""+marcadorVueltas;

Terminar la partida al llegar a las dos vueltas

Condiciones del panel animator

Es posible crear parámetros (panel animator -> pestaña parameters) y vincularlos a las transiciones que unen:

  1. ‘Any state’ y una animación
  2. Dos animaciones

Lo que no hacemos es vincularlo a una transición entre ‘Entry’ y cualquier otro estado o animación.

Para que una animación deje de ejecutarse, debemos definir una transición de salida a otra animación. En este caso, la animación de salida será ‘idle’ (el cubo en su posición inicial);

De esta forma, las animaciones se ejecutrarán sólo si se cumplen ciertas condiciones (que podemos definir en el inspector al seleccionar una transición).

unity3d panel animator

Tener en cuenta:

  1. si en el listado de condiciones que aparece en el panel inspector al seleccionar una transición, tenemos una condición asociada a un hueco vacío (en el lugar en el que debería aparecer el parámetro), las otras condiciones no funcionarán.
  2. si la check ‘Can transition to self‘ de settings que se muestra en el inspector cuando tenemos una transición seleccionada está desmarcada, evitaremos que la animación se ejecute de nuevo hasta que no haya salido de ese estado.

Ejercicio: Animación sin Scripting

Crear tres animaciones vinculadas a un cubo.

  • idle: será la animación por defecto. Es una animación sin fotogramas clave.
  • horizontal: es una animación con dos fotogramas clave. El cubo se moverá horizontalmente.
  • vertical: es una animación con dos fotogramas clave. El cubo de moverá verticalmente.
ejercicio panel animator en unity 3d

Luego, en el panel animator, añadir parámetros y finalmente establecer condiciones en las transiciones para que estas se ejecuten sólo para valores concretos de los parámetros.

← PONG
Videojuego de Plataformas con Unity3D →

Aviso Legal | Política de privacidad