Unreal Engine: Implementando IA Básica con Behaviour Trees y EQS para Enemigos
Este tutorial te guiará a través de la implementación de inteligencia artificial básica para enemigos en Unreal Engine. Exploraremos cómo utilizar Behaviour Trees para definir lógicas de comportamiento y el Environmental Query System (EQS) para que la IA tome decisiones inteligentes en su entorno. Aprenderás a configurar tu enemigo desde cero hasta tener un comportamiento reactivo.
🚀 Introducción a la IA en Unreal Engine con Behaviour Trees y EQS
Crear enemigos convincentes y desafiantes es fundamental para la inmersión en cualquier videojuego. En Unreal Engine, tenemos herramientas potentes como los Behaviour Trees (Árboles de Comportamiento) y el Environmental Query System (EQS) que nos permiten diseñar inteligencias artificiales sofisticadas y dinámicas sin necesidad de escribir mucho código complejo. Este tutorial te llevará de la mano para implementar una IA básica de enemigo que patrulla, detecta al jugador y lo persigue.
¿Qué son los Behaviour Trees? 🌳
Los Behaviour Trees son una forma jerárquica y modular de organizar la lógica de comportamiento de la IA. Piensa en ellos como un diagrama de flujo de decisiones y acciones que la IA ejecuta. Permiten crear comportamientos complejos a partir de unidades más pequeñas y manejables, facilitando la depuración y expansión.
¿Qué es el Environmental Query System (EQS)? 🗺️
EQS es un sistema de consulta de entorno que permite a la IA evaluar el mundo del juego y tomar decisiones informadas. Por ejemplo, puede encontrar la mejor cobertura, un punto de flanqueo, o determinar si un área es segura. EQS utiliza 'generadores' y 'pruebas' para calificar ubicaciones y objetos en el entorno, devolviendo los mejores resultados para que la IA actúe sobre ellos.
🛠️ Configuración Inicial del Proyecto y Actor de IA
Antes de sumergirnos en la lógica, necesitamos configurar nuestro proyecto y el personaje que actuará como enemigo.
Paso 1: Crear un Nuevo Proyecto y Personaje Básico
- Crea un nuevo proyecto de Unreal Engine: Usa la plantilla de
Third PersonoFirst Personpara tener un jugador y un nivel básico. - Crea un Blueprint de Personaje para el Enemigo:
- Haz clic derecho en el
Content Browser>Blueprint Class. - Selecciona
Charactercomo clase padre y nómbraloBP_EnemyCharacter. - Abre
BP_EnemyCharactery asigna unMesh(por ejemplo,SK_Mannequin) y unAnim Blueprint(ABP_MannyoABP_Quinn_C) en elSkeletal Mesh Component. - Ajusta la cápsula de colisión y la posición del
Meshsi es necesario.
- Haz clic derecho en el
Paso 2: Crear el AI Controller y el Blackboard
La IA necesita un controlador para ejecutar su lógica y un Blackboard para almacenar los datos que utilizará. El Blackboard es esencialmente una pizarra donde la IA escribe y lee información.
-
Crea un AI Controller para el Enemigo:
- Haz clic derecho en el
Content Browser>Blueprint Class. - Busca
AIControllery selecciónalo. NómbraloAIC_Enemy.
- Haz clic derecho en el
-
Crea un Blackboard Asset:
- Haz clic derecho en el
Content Browser>Artificial Intelligence>Blackboard. - Nómbralo
BB_Enemy. - Abre
BB_Enemyy añade las siguientes claves:TargetActor(Tipo:Object, Clase:Actor) - Para almacenar la referencia al jugador.SelfActor(Tipo:Object, Clase:Actor) - Para almacenar la referencia al propio enemigo.LocationToMoveTo(Tipo:Vector) - Para almacenar la ubicación a la que el enemigo debe moverse.HasLineOfSight(Tipo:Boolean) - Para saber si el enemigo tiene línea de visión con el jugador.
- Haz clic derecho en el
-
Asigna el AI Controller al Personaje Enemigo:
- Abre
BP_EnemyCharacter. - En
Detailspanel, buscaPawny en la secciónAI Controller Class, seleccionaAIC_Enemy. - Marca
Auto Possess AIcomoPlaced in World or Spawned.
- Abre
🧠 Creando el Behaviour Tree (Árbol de Comportamiento)
El Behaviour Tree será el corazón de la lógica de nuestro enemigo. Definiremos cómo patrulla, detecta y persigue al jugador.
Paso 3: Crear el Behaviour Tree
-
Crea un Behaviour Tree Asset:
- Haz clic derecho en el
Content Browser>Artificial Intelligence>Behavior Tree. - Nómbralo
BT_Enemy.
- Haz clic derecho en el
-
Asigna el Blackboard al Behaviour Tree:
- Abre
BT_Enemy. - En el panel
Details, buscaBlackboard Assety seleccionaBB_Enemy.
- Abre
-
Estructura Básica del Behaviour Tree:
- El nodo raíz es
Root. - Desde
Root, arrastra y suelta para crear un nodoSelector. LosSelectorintentan ejecutar sus hijos de izquierda a derecha y se detienen en el primero que tiene éxito. Si uno de sus hijos tiene éxito, elSelectortambién tiene éxito. Si todos sus hijos fallan, elSelectorfalla. - Desde el
Selector, arrastra y suelta para crear dosSequencenodes. LosSequenceejecutan sus hijos de izquierda a derecha y se detienen si uno falla. Si todos sus hijos tienen éxito, elSequencetiene éxito.
- El nodo raíz es
Paso 4: Implementando la Detección del Jugador
Necesitamos que nuestro enemigo pueda detectar al jugador. Usaremos un Service para verificar constantemente la presencia del jugador y su línea de visión.
-
Crea un Blueprint Service:
- Haz clic derecho en el
Content Browser>Blueprint Class. - Busca
BTService_BlueprintBasey selecciónalo. NómbraloBTS_CheckForPlayer.
- Haz clic derecho en el
-
Lógica del Servicio
BTS_CheckForPlayer:- Abre
BTS_CheckForPlayer. - Sobrescribe la función
Receive Tick AI. - Desde
Owner Controller(del nodoReceive Tick AI), arrastra y suelta para obtener unGet Controlled Pawn. Conéctalo aSelfActoren el Blackboard (Set Blackboard Value as Object). - Desde
Get Controlled Pawn, obten unGet Actor Location. - Desde
Get Controlled Pawn, obten unGet Player Charactery luego unGet Actor Locationpara el jugador. - Usa un
LineTraceByChannel(oLineTraceForObjects) desde la ubicación del enemigo a la ubicación del jugador. Canal:Visibility. - Si el
Line Tracegolpea al jugador (compara elHit Actorcon elGet Player Character), entonces tenemos línea de visión. - Establece la clave
TargetActoren el Blackboard con elGet Player Charactersi se detecta. - Establece la clave
HasLineOfSighten el Blackboard según el resultado delLine Trace. - Usa un
Branchpara decidir si se estableceTargetActoro si se borra (si el jugador no está visible o muy lejos).
- Abre
-
Añade el Servicio al Behaviour Tree:
- Abre
BT_Enemy. - Selecciona el nodo
Root(o elSelectorprincipal). - En el panel
Details, haz clic enAdd Servicey seleccionaBTS_CheckForPlayer. - Ajusta la frecuencia de actualización del servicio (
Interval). Por ejemplo,0.5segundos.
- Abre
Paso 5: Implementando la Persecución del Jugador
Ahora que podemos detectar al jugador, haremos que el enemigo lo persiga.
- Primer
Sequence(Perseguir al Jugador):- En
BT_Enemy, selecciona el primerSequence. - Añade un
Blackboard DecoratoralSequence. Configúralo para que tenga éxito solo siTargetActorIs Set yHasLineOfSightIs Equal to True. - Desde este
Sequence, arrastra y suelta para crear unMove Totask. SeleccionaTargetActorcomo clave. - Desde el mismo
Sequence, arrastra y suelta para crear unWaittask (para que espere un momento antes de volver a moverse, o unAttacktask si tuvieras uno).
- En
Paso 6: Implementando el Patrullaje
Si el enemigo no detecta al jugador, debe patrullar una serie de puntos o un área aleatoria.
-
Crea un Blueprint Task para Patrullar:
- Haz clic derecho en el
Content Browser>Blueprint Class. - Busca
BTTask_BlueprintBasey selecciónalo. NómbraloBTT_FindPatrolLocation.
- Haz clic derecho en el
-
Lógica del
BTT_FindPatrolLocation:- Abre
BTT_FindPatrolLocation. - Sobrescribe la función
Receive Execute AI. - Desde
Owner Controller, obténGet Controlled Pawny luegoGet Actor Location. - Usa un
Get Random Reachable Point in Radius(desdeNavigation Systemo directamente delPawnsi tienesAI Navigationactivado) alrededor de la ubicación actual del enemigo. Define un radio de patrulla (ej. 1000 unidades). - Si se encuentra una ubicación válida, establece la clave
LocationToMoveToen el Blackboard. - Llama a
Finish Executecon éxito o fallo según si se encontró una ubicación.
- Abre
-
Segundo
Sequence(Patrullar):- En
BT_Enemy, selecciona el segundoSequence. - Añade un
Blackboard DecoratoralSequence. Configúralo para que tenga éxito solo siTargetActorIs Not Set. - Desde este
Sequence, arrastra y suelta para crear unBTT_FindPatrolLocationtask. - Desde el mismo
Sequence, arrastra y suelta para crear unMove Totask. SeleccionaLocationToMoveTocomo clave. - Desde el mismo
Sequence, arrastra y suelta para crear unWaittask. Por ejemplo,Wait3 segundos.
- En
🌍 Mejorando la Toma de Decisiones con EQS
EQS nos permitirá encontrar puntos de patrulla más inteligentes, cubrirse o flanquear al jugador. Para este tutorial, lo usaremos para encontrar un punto de patrulla aleatorio y accesible.
Paso 7: Creando un Query EQS para Puntos de Patrulla
-
Crea un EQS Context:
- Haz clic derecho en el
Content Browser>Blueprint Class. - Busca
EnvQueryContext_BlueprintBasey selecciónalo. NómbraloEQSContext_SelfActorLocation. - Abre
EQSContext_SelfActorLocation. SobrescribeProvide Contexty desdeQuerier, obtenGet Controlled Pawny luegoGet Actor Location. Establece esta ubicación como la salida del contexto (Resulting Location).
- Haz clic derecho en el
-
Crea un EQS Query:
- Haz clic derecho en el
Content Browser>Artificial Intelligence>Environment Query. - Nómbralo
EQS_PatrolPoints. - Abre
EQS_PatrolPoints.- Generador: Añade un
Simple Gridgenerator.Grid Size: 500 (o un valor adecuado para tu nivel).Space Between: 200.Center: SeleccionaEQSContext_SelfActorLocation.
- Prueba (Test): Añade un
Pathfinding Batchtest.Context:EQSContext_SelfActorLocation.Query Param:Item.Score Multiplier: 1.Scoring Equation:Linear.Weight: 1.- Esto asegura que los puntos generados sean accesibles por el enemigo.
- Generador: Añade un
- Haz clic derecho en el
Paso 8: Integrando EQS en el Behaviour Tree
Modificaremos la tarea BTT_FindPatrolLocation para usar EQS.
- Modifica
BTT_FindPatrolLocation:- Abre
BTT_FindPatrolLocation. - Reemplaza el nodo
Get Random Reachable Point in Radiuspor un nodoRun EQS Query. - En
Run EQS Query, seleccionaEQS_PatrolPointscomoQuery Template. Query Owner:Self.Run Mode:Best Item.Query Result Set BlackBoard Value: SeleccionaLocationToMoveTo.- Conecta la salida de
Run EQS QueryaFinish Executecon éxito o fallo.
- Abre
🏃 Ejecutando y Depurando la IA
Una vez que todo está configurado, es hora de probar y depurar.
Paso 9: Colocar el Enemigo en el Nivel
- Arrastra una instancia de
BP_EnemyCharacterdesde elContent Browsera tu nivel.
Paso 10: Iniciar la Simulación y Depurar
- Haz clic en
Playpara iniciar el juego. - Mientras el juego está en ejecución, selecciona tu
BP_EnemyCharacteren elWorld Outliner. - En la barra de herramientas del editor, busca el botón
Debugy seleccionaAI Debugger. - También puedes abrir el
Behaviour Tree Editor(BT_Enemy) y verás la ejecución en tiempo real, con los nodos activos resaltados. - Para depurar EQS, abre
EQS_PatrolPointsy haz clic enDebugen la barra de herramientas. Verás los puntos generados y sus calificaciones.
Posibles Problemas y Soluciones:
- El enemigo no se mueve:
- Verifica que el
Nav Mesh Bounds Volumecubra el área. - Asegúrate de que el
AI Controlleresté asignado yAuto Possess AIesté configurado. - Revisa los
Blackboard Decoratorspara asegurarte de que las condiciones se cumplan.
- Verifica que el
- El enemigo no detecta al jugador:
- Verifica la lógica de
BTS_CheckForPlayer, especialmente elLineTrace. - Asegúrate de que
TargetActorse esté estableciendo correctamente en el Blackboard.
- Verifica la lógica de
- EQS no genera puntos:
- Comprueba que el
Nav Mesh Bounds Volumeesté presente y actualizado (Pen el editor para visualizarlo). - Asegúrate de que el
EQSContext_SelfActorLocationesté retornando la ubicación correcta.
- Comprueba que el
✨ Mejoras y Pasos Futuros
Esta es solo la punta del iceberg. Puedes expandir esta IA de muchas maneras:
- Comportamientos de ataque: Añade una tarea
Attackal Behaviour Tree cuando el jugador esté cerca. - Comportamientos defensivos: Usa EQS para encontrar cobertura o puntos de retirada.
- Percepción avanzada: Implementa
AI Perceptionpara detección de visión, audición, etc., y actualiza el Blackboard en consecuencia. - Patrullas por waypoints: Crea una lista de
Actorsen el nivel y haz que la IA los visite secuencialmente. - Estados de IA: Implementa estados como
Idle,Patrol,Chase,Attack,Fleey transiciones entre ellos usando decoradores y servicios. - Interacciones complejas: Permite que los enemigos se comuniquen entre sí o reaccionen a eventos del mundo.
FAQ: Preguntas Frecuentes sobre IA en Unreal Engine
P: ¿Es mejor usar Blueprints o C++ para la IA? R: Para IA básica y de complejidad media, Blueprints son excelentes por su rapidez de iteración y visibilidad. Para lógica muy compleja, o para optimización de rendimiento en juegos grandes, C++ puede ser preferible. A menudo, se usa una combinación: la lógica principal en Blueprints y tareas muy específicas o de bajo nivel en C++.
P: ¿Qué diferencia hay entre un Service y un Task en un Behaviour Tree?
R: Un Task es una acción que la IA realiza (ej. Moverse, Atacar). Un Service es una tarea que se ejecuta repetidamente mientras su rama del árbol está activa, a menudo para actualizar el Blackboard o verificar condiciones (ej. Comprobar si el jugador está visible).
P: ¿Qué es un Decorator?
R: Los Decorators son condiciones que determinan si una rama del Behaviour Tree puede ejecutarse. Son como puertas que se abren o cierran en función de los datos del Blackboard o de otras condiciones.
Con estas bases, tienes un punto de partida sólido para crear enemigos con comportamientos complejos y atractivos en tus juegos de Unreal Engine. ¡Experimenta y diviértete construyendo tu propia legión de IAs!
Tutoriales relacionados
Comentarios (0)
Aún no hay comentarios. ¡Sé el primero!