Home | Clases | Unity: Videojuego para 2 jugadores en 2D estilo Pong | Movimiento de las raquetas

Movimiento de las raquetas


Introducción

Como hemos comentado al inicio, las raquetas se deben mover hacia arriba y hacia abajo con el teclado, mientras que la bola se moverá en todas direcciones y sentidos y en función del lugar en el que rebote.

En ambos casos, debemos hacer uso de la programación. Para organizar lo archivos, primero de todo crea una nueva carpeta llamada Scripts dentro de Assets.

Unity provee una serie de comandos de entrada básicos, que puedes consultar haciendo clic en Edit > Project Settings > Input:



Por defecto, viendo el Vertical Axis vemos que podemos movernos arriba y abajo. con las flechas up/down o con W/S.

Como necesitamos dos jugadores, vamos a realizar unos cambios de modo que podamos utilizar S/W para uno y Up/Down para el otro:

  • Borra S y W de Alt Negative Button y Alt Positive Button, respectivamente.
  • Incrementa en 1 el Size de Axes para que sea 19 y aparezca uno nuevo (abajo del todo)
  • Renómbralo como Vertical 2.
  • Establece S y W como Negative Button y Positive Button, respectivamente.
  • Cambia el resto de valores apra que sean similares al al eje Vertical.
  • El resultado final debe ser similar a este:




El script

Para configurar el movimiento de las raquetas, lo primero que necesitamos es crear, dentro de la carpeta Scripts, un New > C# Script con el nombre Raqueta:


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

public class Raqueta : MonoBehaviour {

// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {

}
}


Como sabes, por defecto se crean los métodos Start(), que se ejecuta automáticamente al inicio, y Update(), que se ejecuta cada frame (a un ritmo de 60fps). Ninguno de ellos devuelve valor alguno (void).

En vez de Update(), es posible utilizar FixedUpdate(), que se actualiza al mismo ritmo pero teniendo en cuenta las fuerzas físicas (cada fixed frame), con lo que es más adecuado y preciso elementos que se mueven.

El movimiento de la raqueta será solo arriba y abajo, y la siguiente imagen nos permite identificar que parámetros tenemos que modificar:

Fuente: https://noobtuts.com/unity/2d-pong-game


Esto es, utilizaremos un Vector2 (un elemento con componentes x e y) en el que x siempre será 0 mientras que y valdrá 0 si está quieta, 1 si se mueve hacia arriba y -1 si se mueve hacia abajo.

Este valor lo multiplicaremos por una determinada velocidad o speed y lo actualizaremos cada fixed frame mientras se pulsen las teclas de movimiento vertical:


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

public class Raqueta : MonoBehaviour {

//Velocidad
public float velocidad= 30.0f;


// Es llamado una vez cada fixed frame
void FixedUpdate () {

//Capto el valor del eje vertical de la raqueta
float v = Input.GetAxisRaw("Vertical");
//Modifico la velocidad de la raqueta
GetComponent<Rigidbody2D>().velocity = new Vector2(0, v * velocidad);

}
}


Como puedes ver en el código anterior, utilizamos variables privadas (el estándar es que sus nombres empiecen por un guión bajo) con la etiqueta [SerializeField] para poder acceder a ellas desde la Inspector window y modificarlas. El uso de variables y métodos privados siempre que sea posible hará que nuestro juego sea más seguro frente a posibles hackeos.

Por último, para que el comportamiento del script funcione, debemos asociar el script a las raquetas arrastrándolo a cada uno de ellas.



El problema es que las dos raquetas se mueven a la vez y solo funciona uno de los controles. Esto es debido a que hemos detectado solo el eje Vertical (y no el Vertical 2) y además no identificamos qué raqueta debemos mover.

Para resolverlo, realiza las siguientes modificaciones en el script:


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

public class Raqueta : MonoBehaviour {

//Velocidad
public float velocidad = 30.0f;

//Eje vertical
public string eje;


// Es llamado una vez cada fixed frame
void FixedUpdate () {

//Capto el valor del eje vertical de la raqueta
float v = Input.GetAxisRaw(eje);
//Modifico la velocidad de la raqueta
GetComponent<Rigidbody2D>().velocity = new Vector2(0, v * velocidad);

}
}


Para terminar:

  • Selecciona la Raqueta Izquierda y en la Inspector window, escribe Vertical 2 como valor de la variable Eje del script
  • Selecciona la Raqueta Derecha y en la Inspector window, escribe Vertical como valor de la variable Eje del script




Ahora ye deberías tener las dos raquetas funcionando cada una con sus controles.
Fecha de publicación: 22/10/2019
Asignaturas: realización de proyectos multimedia interactivosdesarrollo de entornos interactivos multidispositivo
Temas: Unity 2d Pong
Utilizamos cookies propias y de terceros para mejorar su experiencia en la navegación. Al seguir navegando entendemos que acepta su uso.
Si lo desea, consulte nuestras políticas de privacidad y cookies
ENTENDIDO
[X] Cerrar

Contacta conmigo


[X] Cerrar

Acceso alumnos