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.
Desafío
FácilUn 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: registraDonguna vez por cada punto de daño (un golpe de 2 lo registra dos veces) y suma los puntos arings.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
{
}
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
1Componentes, no jerarquías
Componentes pequeñosUn script base para enemigosComponentes abstractosComponentes que trabajan juntosRepaso: torreta modular4Datos serializados
Clases serializablesListas en el InspectorEnumeraciones en el InspectorRepaso: tabla de botín7Máquinas de estados
Estados como clasesUna máquina de estadosTransicionesCerebros de enemigosRepaso: estados de puertas10Proyecto: Superviviente de la arena
El héroeTipos de enemigos2Interfaces en Unity
IDamageableInterfaces y TryGetComponentGetComponentsRepaso: tecla de interacción5ScriptableObjects
Recursos de datosEstadísticas de armasConfiguración compartidaOleadas como datosRepaso: base de datos de objetos