IDamageable
Parte de la sección Arquitectura de juegos en Unity del Journey de Unity de Coddy. Lección 7 de 64.
Una interfaz es una lista de métodos que una clase se compromete a tener, sin código en ellos. Las clases que no tienen nada más en común pueden hacer la misma promesa. En C# puro:
interface IGreeter
{
string Greet();
}
class Robot : IGreeter
{
public string Greet() { return "Beep"; }
}
class Cat : IGreeter
{
public string Greet() { return "Meow"; }
}Una variable de tipo IGreeter puede contener un Robot o un Cat, y greeter.Greet() ejecuta el método del objeto que contenga. Una clase que enumera IGreeter pero no tiene un Greet() público no compila.
En un juego, muchas cosas 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 da nombre a 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 TakeDamage(int) público, o no compila.
El objeto que inflige 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 añadido más adelante no requiere ningún cambio aquí. Unity no muestra en el Inspector un campo de un tipo de interfaz, así que los scripts guardan un GameObject o un componente y le piden la interfaz, como hace la bola de fuego.
Desafío
FácilHaz que el muñeco de nieve, la campana y el espantapájaros implementen IDamageable para que el martillo los golpee.
Snowman:TakeDamagelo reduce en0.25f * amounten cada eje; si llega a 0.5 o menos, destrúyelo.Bell: registraDonguna vez por cada punto y sumaamountarings.Scarecrow: solo el primer golpe ejecutatransform.Rotate(0f, 0f, 90f);.- En
Slam, llama aTakeDamage(power)en el IDamageable de cada colisionador, si lo tiene.
Pulsa «Jugar» y golpea a cada uno. Después, pulsa «Comprobar».
Pruébalo tú mismo
using UnityEngine;
public class Snowman : MonoBehaviour
{
}
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 modularRepaso: cañón doble4Datos serializados
Clases serializablesListas en el InspectorEnumeraciones en el InspectorRepaso: tabla de botínRepaso: sortear el botín2Interfaces en Unity
IDamageableInterfaces y TryGetComponentGetComponentsRepaso: Tecla de interacciónRepaso: El más cercano al alcance5ScriptableObjects
Activos de datosEstadísticas de armasConfiguración compartidaGuardar el vientoOleadas como datosRepaso: base de datos de objetosRepaso: comprar en la tienda3Eventos
Eventos de C# en UnitySuscribirse en OnEnableCampos UnityEventLos eventos controlan la interfazRepaso: ventana emergente de logrosRepaso: temporizador de la ventana emergentePractica por tu cuenta: Playground de Unity