Menu
CoddyTech

IDamageable

Parte de la sección Arquitectura de juegos en Unity del Journey de Unity de Coddy. Lección 6 de 50.

Muchas cosas de un juego pueden recibir daño y tienen poco más en común: el jugador tiene puntos de vida, una caja se rompe con el primer golpe. Una clase base compartida las obligaría a pertenecer a una misma familia. Una interfaz nombra lo único que comparten, y cada script lo implementa a su manera:

public interface IDamageable
{
    void TakeDamage(int amount);
}
public class PlayerHealth : MonoBehaviour, IDamageable
{
    public int hp = 10;

    public void TakeDamage(int amount)
    {
        hp -= amount;
        Debug.Log("Ouch! hp: " + hp);
    }
}
public class Crate : MonoBehaviour, IDamageable
{
    public void TakeDamage(int amount)
    {
        Destroy(gameObject);
    }
}

Un script sigue teniendo una clase base, MonoBehaviour, y enumera las interfaces después. La interfaz va en un archivo propio, IDamageable.cs, y no deriva de MonoBehaviour: no es un componente y nunca se añade a un objeto por sí sola. Una clase que la enumera debe tener un método público TakeDamage(int), o no compilará.

Lo que sea que inflija el daño solicita la interfaz, no una clase:

// Fireball.cs
void OnCollisionEnter(Collision collision)
{
    IDamageable target = collision.gameObject.GetComponent<IDamageable>();
    if (target != null)
    {
        target.TakeDamage(3);
    }
    Destroy(gameObject);
}

La bola de fuego daña al jugador y rompe las cajas con las mismas líneas, y un tipo de objetivo que se añada más adelante no requiere cambios aquí. Unity no muestra en el Inspector un campo de tipo interfaz, así que los scripts guardan un GameObject o un componente y le solicitan la interfaz, como hace la bola de fuego.

challenge icon

Desafío

Fácil

Un gigante protege la plaza del pueblo. Las flechas mueven al Gigante (Mover.cs, listo), y la tecla Espacio hace que blanda su martillo: Hammer.cs llama a Slam(), que encuentra todos los colisionadores dentro de radius. Tres cosas de la plaza reciben un golpe, cada una a su manera, y no comparten nada más:

  • Snowman: cada punto de daño le resta 0.25 a su tamaño en cada eje (empieza en 1.5). Cuando su tamaño es 0.5 o menos, se derrite: destruye el muñeco de nieve.
  • Bell: registra Dong una vez por cada punto de daño (un golpe de 2 lo registra dos veces) y suma los puntos a rings.
  • Scarecrow: el primer golpe lo derriba y lo gira 90 grados alrededor de z, sin importar el daño. Los golpes posteriores no cambian nada.

IDamageable.cs declara la interfaz, con un método: void TakeDamage(int amount). Haz que Snowman, Bell y Scarecrow la implementen, cada uno con su propia reacción. Después, en Slam, llama a TakeDamage(power) en el IDamageable de cada colisionador que encuentre. Se omiten los colisionadores que no tengan uno, como el suelo.

Pulsa Jugar, acércate a cada uno y blande el martillo; después, pulsa Comprobar.

Pruébalo tú mismo

using UnityEngine;

public class Snowman : MonoBehaviour
{
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Arquitectura de juegos en Unity