Videojuego PONG con Unity 3D

Curso de Unity 3D

21.  
40.  

Por 9.99€ al mes tendrás acceso completo a todos los cursos. Sin matrícula ni permanencia.

Ponemos el fondo en pantalla

Ponemos la pelota en pantalla

pelota pong con Unity

Añadimos el script de movimiento a la pelota

Asginamos un BoxCollider2D a la pelota, con Body Type: Dynamic y Gravity Scale:0. También le añadimos un RigidBody2D para que el siguiente código funcione.

public class Ball: MonoBehaviour{
    void Start(){
        float speed = 4;
        int directionX = Random.Range(0, 2) == 0 ? 1 : -1;
        int directionY = Random.Range(0, 2) == 0 ? 1 : -1;

        GetComponent<Rigidbody2D>().velocity = new Vector2(directionX * speed, directionY * speed);
    }
}

Hacemos que la pelota rebote contra los límites superior e inferior de la pantalla

  1. Colocamos dos cubos estirados en la parte superior e inferior de la pantalla.
  2. Asignamos un BoxCollider2D a los cubos.
  3. Creamos un nuevo Physics Material 2D ( Botón derecho sobre el panel de proyecto → Create → 2D → Physics material 2D). A este material le asignamos estos valores:
    • Friction: 0
    • Bounciness: 1
  4. Asginamos el Physics Material 2D a la correspondiente propiedad del Box Collider 2D de la bola.

Poniendo en pantalla las palas.

Las palas deberían de tener un área colisionable, de tal forma que la pelota rebote contra ellas.

Esto ya lo deberías saber hacer tú :D.

Moviendo las palas

public KeyCode up;
public KeyCode down;
float speedY = 2;

void Update(){
    Move();
}

void Move(){
     if (Input.GetKey(up)){
            transform.Translate(0, speedY * Time.deltaTime, 0);
     }
else if (Input.GetKey(down)){
            transform.Translate(0, -speedY * Time.deltaTime, 0);
     }
}

Limitando el movimiento de las palas

Puede que tengamos que echarle un vistazo a este enlace.

float bottomLimit, topLimit;
  
void Start(){
        bottomLimit = Utils.GetBottomSide() + GetComponent<BoxCollider2D>().size.y / 2;
        topLimit = Utils.GetTopSide() - GetComponent<BoxCollider2D>().size.y / 2;
}

void Update(){
    if (Input.GetKey(up) && transform.position.y < topLimit){
            transform.Translate(0, speedY * Time.deltaTime, 0);
    }
    ...
Utils.cs
public class Utils : MonoBehaviour
{
    public static float GetLeftSide(){
        return Camera.main.ScreenToWorldPoint(Vector2.zero).x;
    }

    public static float GetRightSide(){
        return Camera.main.ScreenToWorldPoint(new Vector2(Screen.width, 0)).x;
    }

    public static float GetBottomSide(){
        return Camera.main.ScreenToWorldPoint(Vector2.zero).y;
    }

    public static float GetTopSide(){
        return Camera.main.ScreenToWorldPoint(new Vector2(0, Screen.height)).y;
    }
}

Si la pelota sale por los límites izquierdo y derecho de la pantalla, debe volver a ser lanzada

Mejoras adicionales

  • Añadir un marcador que se incrementa cuando la pelota sale por uno de los lados de la pantalla.
  • Meter la escena de perder el juego.

Por 9.99€ al mes tendrás acceso completo a todos los cursos. Sin matrícula ni permanencia.