Arquitectura de IA para NPCs en Roblox: Árboles de Comportamiento, FSM y Percepción

By DopaBrain Roblox AI Engineering Team • Updated: September 2026 • Reading Time: 9 min

Herramientas de Ingeniería y Rendimiento Cognitivo

Crear enemigos realistas en Roblox requiere un sistema de toma de decisiones bien diseñado. Concentrar el comportamiento en un único script con decenas de condicionales anidados genera errores de movimiento, atascos lógicos y caídas graves en los servidores.

Los juegos profesionales combinan Máquinas de Estados Finitos (FSM) para estados globales y Árboles de Comportamiento para decisiones jerárquicas tácticas. Esta guía analiza la implementación de tablas Blackboard, detección de visión por raycasting y balanceo de ticks por LOD.

1. Máquinas de Estados Finitos (FSM) vs. Árboles de Comportamiento (BT)

Selección del patrón según la complejidad del enemigo:

2. El Patrón Blackboard y Detección Sensorial

Conciencia espacial sin sobrecargar el procesador del servidor:

3. Production Implementation Architecture

ServerScriptService.NPCFramework.StateMachine
-- Modular Finite State Machine for Roblox NPC
local StateMachine = {}
StateMachine.__index = StateMachine

function StateMachine.new(npcInstance, states, initialState)
    local self = setmetatable({}, StateMachine)
    self.NPC = npcInstance
    self.States = states
    self.CurrentState = nil
    self.Blackboard = {
        Target = nil,
        LastSeenPos = nil,
        Health = 100,
        PatrolPoints = {}
    }
    
    self:ChangeState(initialState)
    return self
end

function StateMachine:ChangeState(newStateName)
    if self.CurrentState and self.States[self.CurrentState].Exit then
        self.States[self.CurrentState]:Exit(self.NPC, self.Blackboard)
    end
    
    self.CurrentState = newStateName
    if self.States[newStateName] and self.States[newStateName].Enter then
        self.States[newStateName]:Enter(self.NPC, self.Blackboard)
    end
end

function StateMachine:Update(dt)
    if self.CurrentState and self.States[self.CurrentState].Update then
        local nextState = self.States[self.CurrentState]:Update(self.NPC, self.Blackboard, dt)
        if nextState and nextState ~= self.CurrentState then
            self:ChangeState(nextState)
        end
    end
end

return StateMachine

4. Nodos de Árboles de Comportamiento: Selectores y Secuencias

Estructuración de prioridades dinámicas:

5. Escalabilidad del Servidor: LOD y Object Pooling

Sostener 60 FPS estables con más de 100 enemigos activos:

Frequently Asked Questions

¿Por qué 30 NPCs causan congelamientos en el servidor?

Porque calcular trazados de ruta y raycasts en cada frame satura el hilo principal. Debe escalonarse la frecuencia con IA LOD.

¿Qué ventaja tiene un Árbol de Comportamiento frente a una FSM?

Permite alternar entre planes tácticos complejos de forma limpia sin crear una maraña inmanejable de flechas de transición.

¿Cómo evitar que los enemigos vean a través de obstáculos?

Lanzando un raycast desde la cabeza del NPC hacia el torso del jugador y comprobando si impacta contra un muro.

¿Puede el cliente gestionar la lógica de IA?

No, la lógica de toma de decisiones y daño debe ser validada por el servidor para evitar trampas y desincronizaciones.

Potencia tu Arquitectura de Sistemas y Análisis

Descubre tu estilo cognitivo y optimiza tu concentración técnica con DopaBrain.

Comenzar Tests en DopaBrain