Está en la página 1de 6

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:

1. Borra S y W de Alt Negative Button y Alt Positive Button, respectivamente.


2. Incrementa en 1 el Size de Axes para que sea 19 y aparezca uno nuevo (abajo del
todo)
3. Renómbralo como Vertical 2.
4. Establece S y W como Negative Button y Positive Button, respectivamente.
5. Cambia el resto de valores apra que sean similares al al eje Vertical.
6. 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:

1. Selecciona la Raqueta Izquierda y en la Inspector window, escribe Vertical 2 como


valor de la variable Eje del script
2. 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 interactivos desarrollo de entornos interactivos
multidispositivo
Temas: Unity 2d Pong

También podría gustarte