Enumeraciones en el Inspector
Parte de la sección Arquitectura de juegos en Unity del Journey de Unity de Coddy. Lección 17 de 50.
Un campo enum aparece en el Inspector como un menú desplegable, lo que lo convierte en una forma práctica de configurar objetos que comparten un mismo script. Un prefab Pickup sirve para monedas, corazones y escudos: cada copia del nivel obtiene su tipo del menú desplegable, y el script actúa según ese valor:
public enum PickupKind { Coin, Heart, Shield }
public class Pickup : MonoBehaviour
{
public PickupKind kind;
public int amount = 1;
void OnTriggerEnter(Collider other)
{
if (!other.TryGetComponent(out PlayerStats stats)) return;
switch (kind)
{
case PickupKind.Coin: stats.coins += amount; break;
case PickupKind.Heart: stats.hp += amount; break;
case PickupKind.Shield: stats.shielded = true; break;
}
Destroy(gameObject);
}
}La escena guarda cada opción como el número del valor: Coin es 0, Heart 1, Shield 2. Añadir un valor al final es seguro. Insertar uno al principio, como en { Gem, Coin, Heart, Shield }, desplaza todos los números y cambia el tipo de cada Pickup en todas las escenas. Cambiar el nombre de un valor es seguro, ya que su número permanece igual. Escribir explícitamente los números, Coin = 0, Heart = 1, Shield = 2, te permite reordenar los nombres más adelante sin cambiar ninguna opción guardada.
Un enum [System.Flags] almacena varios valores a la vez. Su menú desplegable tiene una casilla por valor, además de «Nada» y «Todo». Cada valor necesita su propio bit, así que los números son potencias de dos:
[System.Flags]
public enum Element { None = 0, Fire = 1, Ice = 2, Poison = 4 }
public Element immuneTo; // marcados en el Inspector: Fire y Poison
public void Hit(int damage, Element element)
{
if (immuneTo.HasFlag(element)) return;
hp -= damage;
}| combina valores: Element.Fire | Element.Poison es 5. HasFlag(x) es true cuando todos los valores de x están establecidos, y ToString() enumera los valores establecidos, como Fire, Poison.
Desafío
FácilLa base tiene tres puertas: el almacén necesita la tarjeta roja, el laboratorio la azul y la bóveda ambas. El valor de needs de cada puerta y el valor de card de cada tarjeta se configuran en el Inspector con el enum Access, y Door.cs y Keycard.cs están listos. Las flechas mueven al Player, cuyo KeyRing guarda las tarjetas recogidas. Termina KeyRing.cs:
- Haz que
Accesssea un enum cuyos valores se puedan combinar, para que una puerta pueda necesitar varias tarjetas y el anillo pueda contener varias. Conserva sus cuatro nombres: None, Red, Blue y Green. Add(Access card)añade una tarjeta al anillo y conserva las que ya están allí.Opens(Access needs)devuelve true cuando el anillo contiene todas las tarjetas deneeds.
Pulsa Play, prueba las puertas, recoge las tarjetas y después pulsa Check.
Pruébalo tú mismo
using UnityEngine;
public enum Access { None, Red, Blue, Green }
public class KeyRing : MonoBehaviour
{
public Access cards;
public void Add(Access card)
{
// añade la tarjeta al llavero sin quitar las que ya tiene
}
public bool Opens(Access needs)
{
// true cuando el llavero contiene todas las tarjetas de needs
return false;
}
}
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