El problema de escalar la IA#
Una máquina de estados (FSM) es perfecta para pocos comportamientos (Patrullar, Perseguir, Atacar). Pero cuando la IA se vuelve compleja —con muchas condiciones, comportamientos anidados y prioridades—, las transiciones entre estados crecen de forma explosiva ("de cada estado a cada estado") y se vuelve inmanejable. Ahí entran los árboles de comportamiento (Behaviour Trees, BT), el estándar de la IA en muchos juegos AAA.
Cómo funciona un árbol#
Un BT es un árbol de nodos que se recorre de arriba abajo cada "tick" (cada cierto tiempo). Cada nodo, al ejecutarse, devuelve uno de tres estados: Éxito, Fallo o En ejecución (running). Los nodos padre deciden qué hacer según lo que devuelvan sus hijos.
Los dos nodos compositores fundamentales:
- Selector (o fallback): prueba sus hijos de izquierda a derecha y para en el primero que tiene éxito. Es un "O": "¿puedo huir? ¿si no, atacar? ¿si no, patrullar?".
- Sequence (secuencia): ejecuta sus hijos en orden y para en el primero que falla. Es un "Y": "ir a la puerta Y abrirla Y cruzarla".
Además hay hojas (las acciones y condiciones concretas: "¿veo al jugador?", "moverme a X", "atacar") y decoradores (modifican a un hijo: invertir, repetir, poner una condición).
Un ejemplo mental#
Un guardia, de mayor a menor prioridad (un Selector arriba):
Selector (haz lo primero que puedas)
├── Sequence: HUIR
│ ├── ¿Vida baja? (condición)
│ └── Correr a la salida (acción)
├── Sequence: ATACAR
│ ├── ¿Veo al jugador? (condición)
│ ├── ¿Está a rango? (condición)
│ └── Atacar (acción)
├── Sequence: PERSEGUIR
│ ├── ¿Veo al jugador? (condición)
│ └── Ir hacia el jugador (acción → NavMesh)
└── Patrullar (acción por defecto, siempre éxito)Cada tick, el árbol intenta huir; si no procede, atacar; si no, perseguir; y si nada aplica, patrulla. Añadir un comportamiento nuevo es enchufar una rama, sin tocar transiciones cruzadas. Ese es su gran valor.
BT vs máquina de estados#
| Máquina de estados (FSM) | Árbol de comportamiento (BT) | |
|---|---|---|
| Estructura | Estados + transiciones | Árbol de nodos con prioridad |
| Escala con la complejidad | Mal (transiciones explotan) | Bien (ramas modulares) |
| Prioridades | Manuales, en cada transición | Implícitas por orden (Selector) |
| Curva | Baja | Media-alta |
| Ideal para | IA sencilla (2-5 comportamientos) | IA compleja, jerárquica |
Para un enemigo con 2-3 comportamientos, una FSM es más simple y suficiente; montar un BT sería sobreingeniería. El BT gana cuando la IA tiene muchos comportamientos con prioridades y condiciones anidadas. Elige la herramienta según la complejidad real, no por moda.
Cómo implementarlo#
Puedes escribir un BT a mano (nodos como clases con un método Evaluar() que devuelve Éxito/Fallo/Running, compositores que recorren sus hijos), pero para producción se suele usar una herramienta visual: el propio Unity ha ofrecido soluciones de Behavior (paquete Muse/Behavior), y hay assets muy usados en la comunidad. Lo importante es entender el concepto: la implementación concreta varía.
La estructura mínima de un nodo hecho a mano:
public enum Estado { Exito, Fallo, Running }
public abstract class Nodo
{
public abstract Estado Evaluar();
}
// Selector: éxito si ALGÚN hijo tiene éxito
public class Selector : Nodo
{
private readonly Nodo[] hijos;
public Selector(params Nodo[] hijos) => this.hijos = hijos;
public override Estado Evaluar()
{
foreach (var h in hijos)
{
var e = h.Evaluar();
if (e != Estado.Fallo) return e; // éxito o running: para aquí
}
return Estado.Fallo;
}
}Más allá: GOAP y utility AI#
Para IA aún más avanzada existen otros enfoques: GOAP (Goal-Oriented Action Planning: la IA planifica una secuencia de acciones para lograr un objetivo) y Utility AI (cada acción tiene una "puntuación" según el contexto y se elige la mejor). Son terreno muy avanzado; los BT cubren la enorme mayoría de necesidades antes de necesitarlos.
Errores frecuentes#
- Montar un BT para una IA de 2 comportamientos (usa una FSM).
- Confundir Selector (primer éxito, "O") con Sequence (primer fallo, "Y").
- No manejar el estado Running y hacer que acciones largas (moverse) se reinicien cada tick.
- Evaluar el árbol entero cada frame para muchos enemigos (tickea cada X, como en percepción de IA).
Ponte a prueba#
Resumen#
Un árbol de comportamiento organiza IA compleja en nodos con prioridad: Selector (primer éxito, "O"), Sequence (primer fallo, "Y"), hojas (acciones/condiciones) y decoradores, cada uno devolviendo Éxito/Fallo/Running. Escala mucho mejor que una FSM cuando hay muchos comportamientos jerárquicos, pero es sobreingeniería para IA sencilla. Combínalo con NavMesh y percepción para las acciones y condiciones. Para casos extremos, existen GOAP y Utility AI.