Introducci贸n al curso y proyecto

1

Qu茅 aprender谩s para programar videojuegos 2D con Unity

2

Introducci贸n a Unity e instalaci贸n

3

Configuraci贸n del proyecto y la interfaz de Unity

4

Importaci贸n de assets

5

Proyecto final

Herramientas para 2D

6

Instalaci贸n de los 2D extras

7

Uso de tilemaps y palettes

8

Soluci贸n del reto: creaci贸n del escenario

Gameplay

9

Agregando nuestro primer script

10

Movimiento del jugador

11

Comportamiento de la c谩mara

12

Disparo direccional

13

Creaci贸n de un proyectil

14

Manejando la cadencia de disparo

15

Crear un target

16

Comportamiento de enemigo

17

Soluci贸n del reto: da帽o a Personaje y Enemigos

18

GameManager

19

Controlar las instancias de enemigos

20

Creaci贸n de Spawnpoints de enemigos

21

Creaci贸n de 铆tems para el jugador

22

Creaci贸n de PowerUps

23

Usando los PowerUps

24

Soluci贸n del reto: invulnerabilidad temporal del jugador

25

Registro de puntuaci贸n

26

Delimitar y mejorar el escenario

27

Interactuando con el escenario

Interfaz de usuario

28

Comenzando a crear la Interfaz de Usuario (UI)

29

Pantalla de Game Over

30

Diagramaci贸n del HUD

31

Comportamiento del HUD

Implementaci贸n de arte

32

Animaci贸n del personaje

33

Soluci贸n del reto: animaci贸n de los enemigos

34

Configurar arte de la UI

35

Agregar VFX: efecto de parpadeo

36

Agregar VFX: sacudiendo la c谩mara

37

Agregar m煤sica y SFX

Depuraci贸n y 煤ltimos toques

38

Depuraci贸n y correcci贸n de detalles

39

Crear un ejecutable para PC

40

隆Conoce los proyectos de este curso y dales feedback!

41

Conclusi贸n

No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Compra acceso a todo Platzi por 1 a帽o

Antes: $249

Currency
$209/a帽o

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscr铆bete

Termina en:

15D
14H
15M
56S

Usando los PowerUps

23/41
Recursos

Aportes 14

Preguntas 1

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

Un powerup que se me ocurre es el de la propia invulnerabilidad por unos segundos.

Mi implementaci贸n de la vulnerabilidad es crear una clase Invulnerabilidad que se encargue de contar el tiempo para que se acabe la invulnerabilidad:

Y luego configurarlo en un evento que cre茅 llamado onReceiveDamage. Cuando reciba da帽o, el jguador se volver谩 invulnerable por 5 segundos como est谩 configurado en la figura de arriba. El componente Damageable tiene una referencia al componente Invulnerability y antes de que reciba da帽o, primero verificar谩 si es que el objeto es vulnerable.

Algo adicional que hice para el PowerUp de 鈥淧owerShot鈥 es que 茅ste solo dure 3 segundos y luego de 茅sos 3 segundos los disparos vuelvan a la normalidad:

En el switch del tipo de PowerUp ir铆a as铆:

case PowerUp.PowerUpType.PowerShot: // Poder de disparo
                    powerShotEnabled = true;
                    StartCoroutine(PowerShotTime()); // Llamamos a la corutina de duraci贸n temporal de powerup powershot
                    break;

Y la corutina simplemente esperar铆a 3 segundos antes de volver a desactivar el powershot:

    // Corutina de duraci贸n temporal del powerUp powershot
    IEnumerator PowerShotTime(){
        yield return new WaitForSeconds(powerShotTime); // Tiempo de espera de x segundos (segundos en la variable powerUpTime)
        powerShotEnabled = false;
    }

Lo que hice para la invulnerabilidad fue crear una variable publica Invulneravility inicializada en falso, la que vuelvo true cuando el enemigo colisiona con el player y la uso para hacer da帽o solo si es false luego una corrutina para volverla false si ya esta en true ac谩 la imagen del c贸digo del player y del enemy

Un PowerUp que simule una escopeta (3 balas a la vez pero una menor distancia o tiempo de vida de las balas).

POWERUP SANADOR!

Mi soluci贸n

bool hasCooldown = false;
private void OnTriggerEnter2D(Collider2D collision)
    {
        if(!hasCooldown)
        {
            if (collision.CompareTag("Enemy"))
            {
                healthP--;
                hasCooldown = true;
                StartCoroutine(Cooldown());
                if (healthP <= 0)
                {
                    Destroy(gameObject);
                }
            }
        }

        if (collision.CompareTag("PowerUp"))
        {
            switch (collision.GetComponent<PowerUp>().powerUpType)
            {
                case PowerUp.PowerUpType.FireRateIncrease:
                    fireRate++;
                    break;
                case PowerUp.PowerUpType.PowerShot:
                    powerShotEnable = true;
                    break;
            }
            Destroy(collision.gameObject, 0.1f);
        }
    }
    IEnumerator Cooldown()
    {
        yield return new WaitForSeconds(3f);
        hasCooldown = false;

        StopCoroutine(Cooldown());
    }

Mi solucion:

En el enemigo tengo el llamado de la funcion TakeDamage() del player:

    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.CompareTag("Player"))
        {
            collision.GetComponent<Player>().TakeDamage();
        }
    }

Y en el player le hice un cambio a la funcion TakeDamage():

bool takeDamageCooldown = true;

    public void TakeDamage()
    {
        if (takeDamageCooldown)
            playerHealth--;
        takeDamageCooldown = false;
        StartCoroutine(TakeDamageCooldown());

        if (playerHealth <= 0)
        {
            //GameOver
        }
    }

    IEnumerator TakeDamageCooldown()
    {
        yield return new WaitForSeconds(3f);
        takeDamageCooldown = true;
    }

Genial

Mi soluci贸n al reto

En el script Player.cs, cree una variable booleana de invulnerabilidad (invulnerability) que comienza en false, luego en la funci贸n 鈥淭akeDamage鈥 activo esa variable (true) despu茅s de recibir da帽o del enemigo, y seguido comienzo una cortina que llama a una 鈥渞utina鈥 (invulnerabilityDelay) que va a esperar esos 3 segundos y despu茅s de ese tiempo vuelve a asignarle el valor false a la variable de invulnerabilidad.

Player.cs

//...

public class Player : MonoBehaviour
{
    // Variable de invulnerabilidad
    bool invulnerability = false;

    // Tiempo de invulnerabilidad
    float invulnerabilityTime = 3f;

    //...

    // Funci贸n de da帽o del enemigo
    public void TakeDamage()
    {
        // Invulnerabilidad del Player al recibir da帽o.
        if (!invulnerability)
        {
            health -= 1;
            invulnerability = true;
            StartCoroutine(invulnerabilityDelay());
        }

        // Destrucci贸n del objeto player si la vida llega a 0.
        if (health <= 0)
        {
            Destroy(gameObject);
        }
    }

    // Rutina de invulnerabilidad
    IEnumerator invulnerabilityDelay()
    {
        yield return new WaitForSeconds(invulnerabilityTime);
        invulnerability = false;
    }

    //...
}

Un Powerup que haga al Player disparar mas balas

se aprende mucho con este curso

Lo que yo hice fue:

  1. Cree dos variables en el script de player una de tipo int que ser铆a el tiempo de duraci贸n de la invulnerabilidad, llamada invulnerabilityTime, y otra de tipo booleano, llamada invulnerability, (que por default estar铆a en false) para determinar si el personaje es invulnerable o no:

  2. En el m茅todo TakeDamage() que creamos en clases anteriores, en el que el personaje recib铆a da帽o, puse como condici贸n que la variable booleana invulnerability deb铆a estar en false para que se ejecutara el mecanismo de reducir la vida del personaje:

  3. Por ultimo, agregue un caso nuevo la secci贸n de las colisiones del personaje con los power ups (Obviamente para lograr esto, previamente aumente el array de power ups existentes en el script PowerUp, y agregu茅 uno llamado Invulnerability). En este nuevo caso especifiqu茅 que el booleano invulnerability cambiara su valor a true, evitando que el personaje pierda vida al colisionar con enemigos (ya que como mencione anteriormente !invulnerability era una condicion para perder vida), y adem谩s agregue una corrutina que se encargar谩 de esperar unos segundos determinados por la variable invulnerabilityTime (para no tener numeros m谩gicos) y despues de este tiempo regresaria a la variable booleana invulnerability a su estado default que es false:

Un power up que se me ocurre es paralizar a los enemigos y tambi茅n desactivarles el da帽o en lo que dura el efecto.

Destroy tiene la opci贸n de retrasar un poco el efecto, de forma que se sienta un tanto natural.