Por comportamientos no nos referimos aquí a cualquier programa que podamos aplicar sobre un actor, sino a cómo la acción de ciertos personajes puede ser descrita mediante, por ejemplo, un árbol de comportamientos formado por distintos nodos entre los que se incluyen «tareas» que representan los actos básicos de dicho personaje.
Las máquinas de estado, los árboles de comportamientos, o el nuevo paradigma de los árboles de estado son técnicas muy extendidas para definir la manera de actuar de los personajes inteligentes en un videojuego.
Árbol de estado
Un árbol de estado (StateTree) es una máquina de estados jerárquica de propósito general que combina los famosos Selectores de los árboles de comportamiento (behavior trees) con los Estados y Transiciones de las máquinas de estados tradicionales, lo que permite hacer lógica de juego bien organizada, flexible y con un buen rendimiento computacional.
Conceptos clave
Un árbol de estado contiene, como su propio nombre indica, Estados organizados en una estructura de árbol.
- Selección de Estado: Aunque se puede iniciar en cualquier lugar, el proceso de selección generalmente comienza evaluando el Estado Raíz (root). Durante este proceso, se evalúan las Condiciones de Entrada (Enter Conditions) de un estado. Si se cumplen, el proceso de selección avanza para considerar sus estados hijo. Cuando se cumplen en un estado que no tiene hijos, ese estado pasa a ser el seleccionado.
- Activación: Es importante entender que al seleccionar ya un estado, se activan todos los estados desde la raíz hasta dicho «estado hoja» del árbol que hemos seleccionado.
- Tareas y Transiciones: Cada estado consta de tareas y transiciones. Las tareas se ejecutan para todos los estados activos (ej. selección de objetivos, reproducción de animaciones, etc.) animación. Todas las tareas de un mismo estado activo se ejecutan simultáneamente. Cuando una tarea se completa o se cumple cierta condición, se dispara una transición que puede conducir a la selección de un nuevo estado.
Elementos del árbol de estado
- Raíz (Root): Generalmente es el primer estado en ser considerado al iniciar el proceso de selección.
- Selector: Un estado que tiene hijos y nunca se selecciona directamente; el proceso de selección siempre pasará a uno de sus hijos.
- Condiciones de Entrada: Lista de condiciones que determinan si un estado puede ser seleccionado.
- Tarea (Task): Acciones que pertenecen a un estado y se ejecutan mientras este está activado.
- Transición (Transition): Define las condiciones para cambiar de estado (ej. cuando una tarea termina o falla).
Proceso de selección
El proceso de selección funciona de manera similar a un árbol de comportamiento. Comienza en la raíz y evalúa las condiciones hacia abajo. Pero no se pone a ejecutar el primer estado que encuentra, como en una máquina de estados, sino que, al igual que el nodo selector de un árbol de comportamiento, si alguna condición para seleccionar un estado hijo falla, se prueba con el siguiente estado hermano. Si es un nodo Selector se mira directamente a sus hijos. Y cuando las condiciones se cumplen en un estado hoja, ESE ESTADO es el que es finalmente seleccionado. Luego las condiciones no se están re-evaluando constantemente, sino sólo si alguna transición nos hace recomenzar el proceso de selección desde un cierto estado.
Flujo de datos
El árbol de estado utiliza enlace de datos (data binding) como técnica para pasar información dentro del árbol. Las condiciones de estado, transiciones y tareas pueden acceder siempre a datos de su nivel en la jerarquía y de niveles superiores
- Parámetros: Variables de entrada que se pueden personalizar (ej. un activo de animación pasado externamente).
- Datos de contexto: Datos predefinidos basados en el actor Blueprint que está usando el árbol de estado.
- Evaluadores: Clases que exponen datos al árbol que no podríamos pasar mediante simples parámetros. Los evaluadores se ejecutan en cada Tick y pueden contener lógica personalizada.
- Tareas globales: Son tareas que están activas durante toda la vida del árbol (desde el inicio hasta la parada), y son útiles para ofrecer datos permanentes (ej. mantener la ‘hora del día’ en el juego).
Clases para extender con Blueprint
La manera habitual de construir un árbol de estado es extenderlo tus propias clases Blueprint, heredando de:
- UStateTreetTaskBlueprintBase (para Tareas)
- UStateTreetEvaluatorBlueprintBase (para Evaluadores)
- UStateTreetConditionBlueprintBase (para Condiciones)
Patrones habituales
- Agrupación: Puedes agrupar tareas similares bajo un estado común para compartir transiciones entre ellas.
- Secuencias: Hay una transición llamada Next (Siguiente) que facilita la creación de una secuencia lineal de estados (como funcionan los nodos Secuencia en árboles de comportmiento, ej. Buscar objetivo -> Moverse -> Usar).
- Manejo de fracasos: El fracaso de una tarea se gestiona jerárquicamente. Es decir, si un estado fracasa, el proceso de selección sube al estado padre para decidir qué hacer (ej. volver a intentarlo… o cambiar a un estado de inactividad).
- Datos jerárquicos: Las tareas pueden compartir datos entre sí. Una tarea del estado padre puede obtener un recurso y pasarlo a las tareas de los estados hijos.
Más información
Se recomienda consultar estos otros documentos:
- https://dev.epicgames.com/documentation/en-us/unreal-engine/artificial-intelligence-in-unreal-engine
- https://dev.epicgames.com/documentation/en-us/unreal-engine/behavior-trees-in-unreal-engine
- https://dev.epicgames.com/documentation/en-us/unreal-engine/state-tree-in-unreal-engine
- https://dev.epicgames.com/documentation/en-us/unreal-engine/environment-query-system-in-unreal-engine
Esta página está licenciada bajo CC BY-NC-SA 4.0 por Laboratorios Narratech.
Referencias