Enumeraciones en el Inspector
Parte de la sección Arquitectura de juegos en Unity del Journey de Unity de Coddy. Lección 20 de 64.
Un campo de enumeración 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 en función de 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 de su valor: Coin es 0, Heart es 1 y Shield es 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 objeto Pickup de todas las escenas. Cambiar el nombre de un valor es seguro, ya que su número sigue siendo el mismo. Escribir los números explícitamente, Coin = 0, Heart = 1, Shield = 2, te permite reordenar los nombres más adelante sin cambiar ninguna opción guardada.
Una enumeración [System.Flags] almacena varios valores a la vez. Su menú desplegable tiene una casilla por valor, además de Nothing y Everything. 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ácilHaz que una puerta necesite varias tarjetas y que el llavero pueda contener varias.
- En
KeyRing.cs, pon[System.Flags]encima deAccessy asígnale estos valores:None = 0, Red = 1, Blue = 2, Green = 4. Add(Access card)conserva las tarjetas que ya hay:cards |= card;.Opens(Access needs)devuelve true solo cuando el llavero contiene todas las tarjetas deneeds.
Pulsa «Jugar» y recoge ambas tarjetas: la bóveda se abre. Después, pulsa «Comprobar».
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 indicadas en needs
return false;
}
}
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