Cómo hacer un NPC enemigo que persiga y ataque en Roblox Studio

Crear enemigos que persigan y ataquen al jugador es una de las mecánicas más emocionantes en Roblox Studio. Con scripts de inteligencia artificial básica, puedes lograr que un NPC detecte la posición del personaje, se mueva hacia él y ejecute ataques de forma autónoma. Esto añade desafío y realismo a cualquier experiencia.
Para implementarlo, necesitarás dominar conceptos como PathfindingService, eventos de toque y variables de estado. Además, ajustar la velocidad y el daño hará que el comportamiento sea equilibrado. A continuación, te explicamos paso a paso cómo construir este sistema desde cero.
Te puede interesar leer: WeldConstraint en Roblox Studio: cómo unir piezas para que no se caigan
Guía básica de NPC enemigo en Roblox Studio

¿Qué es un NPC enemigo y cómo funciona?
Un NPC enemigo es un personaje que el servidor controla en lugar del jugador, y que actúa por su cuenta siguiendo unas reglas que tú programas. El ciclo es siempre el mismo: detecta al jugador más cercano, se desplaza hacia él y le inflige daño cuando lo tiene a tiro. Para funcionar necesita un modelo con Humanoid, un script de comportamiento y algún sistema que le permita saber dónde está su objetivo.
Componentes esenciales del NPC
Antes de escribir una línea de código conviene tener el modelo bien montado, porque si falta alguna pieza el script no funcionará por mucho que esté bien escrito. Estos son los elementos imprescindibles.
| Componente | Función | Obligatorio |
|---|---|---|
| Humanoid | Permite el movimiento y gestiona la salud | Sí |
| HumanoidRootPart | Centro de posición y de físicas | Sí |
| Script de servidor | Controla la persecución y el ataque | Sí |
| Animator | Reproduce las animaciones del NPC | Recomendado |
Primeros pasos en Roblox Studio
La forma más rápida de empezar es duplicar un personaje ya existente o insertar un modelo de NPC desde la Toolbox, ya que así te aseguras de que tenga todas las piezas. Después coloca un Script dentro del modelo y arranca con lo básico: recorrer la lista de jugadores y quedarte con el más cercano. A partir de ahí solo queda añadir el movimiento y el ataque.
¿Cómo detecta el NPC al jugador más cercano?

Métodos de detección disponibles
La detección es el cimiento de todo el comportamiento: sin ella el NPC no sabe hacia dónde ir. El método más común es medir distancias, pero puedes refinarlo comprobando si hay paredes de por medio. Combinar ambos evita que el enemigo te persiga a través de un edificio entero.
- Por distancia: Calcula la magnitud entre las posiciones del NPC y de cada jugador para saber quién está más cerca.
- Línea de visión: Lanza un Raycast hacia el jugador para confirmar que no hay obstáculos entre ambos.
- Por zona: Usa una pieza invisible con el evento Touched para activar la IA solo cuando alguien entra en el área.
Optimización del bucle de detección
Comprobar la posición de todos los jugadores en cada fotograma es un desperdicio absoluto de recursos. Un enemigo no necesita esa precisión: basta con que revise varias veces por segundo. Guardar las referencias fuera del bucle también ahorra bastante trabajo al servidor.
- Usar task.wait: Espera entre 0.2 y 0.5 segundos entre comprobaciones, más que suficiente para la persecución.
- Filtrar por radio: Descarta de entrada a los jugadores que estén fuera del rango de detección.
- Guardar referencias: Declara el Humanoid y el HumanoidRootPart fuera del bucle en lugar de buscarlos cada vuelta.
Errores comunes al detectar
Muchos NPC fallan porque intentan perseguir a personajes que ya no existen, algo habitual cuando un jugador muere o se desconecta a mitad de la persecución. Validar que el objetivo sigue vivo antes de cada acción evita esos errores en la consola. El Raycast también da problemas si no filtras bien.
- No comprobar la salud: Verifica que el Humanoid del objetivo exista y tenga vida antes de perseguirlo.
- Personaje inexistente: Confirma que el jugador tiene un Character cargado, ya que puede estar reapareciendo.
- Raycast mal filtrado: Excluye al propio NPC del filtro o el rayo chocará consigo mismo siempre.
¿Cómo hace el NPC para perseguir al jugador sin trabarse?

Uso correcto de MoveTo
El método MoveTo es la forma estándar de mover un Humanoid hacia una posición concreta del mapa. La clave está en que hay que llamarlo repetidamente, porque el jugador se mueve y el destino queda obsoleto en segundos. Actualizarlo varias veces por segundo hace que la persecución se sienta fluida.
- Actualizar el destino: Llama a MoveTo con la posición actual del jugador cada 0.2 segundos aproximadamente.
- Evitar el tiempo de espera: MoveTo se cancela solo tras 8 segundos sin llegar, así que refréscalo antes de ese límite.
- Detenerse al llegar: Llama a MoveTo con la posición del propio NPC para frenarlo cuando alcance su objetivo.
Evitar obstáculos y paredes
El Humanoid por sí solo camina en línea recta y se queda atascado en la primera pared. Para que rodee los obstáculos necesitas PathfindingService, que calcula una ruta válida respetando la geometría del mapa. Recorrer esos puntos uno a uno convierte a tu enemigo en algo mucho más inteligente.
- Crear la ruta: Genera un objeto de camino con PathfindingService:CreatePath incluyendo los parámetros del agente.
- Calcular el trayecto: Usa ComputeAsync desde la posición del NPC hasta la del jugador y comprueba su estado.
- Recorrer los waypoints: Mueve al Humanoid punto por punto esperando el evento MoveToFinished entre cada uno.
Control de la velocidad y animaciones
La velocidad del enemigo define por completo la dificultad de tu juego. Si supera al jugador resulta imposible escapar, y si es demasiado lento pierde toda la tensión. Acompañarlo de animaciones de carrera hace que el movimiento no parezca un deslizamiento.
- Configurar WalkSpeed: Valores entre 8 y 14 funcionan bien, dejando margen para que el jugador pueda huir.
- Cargar animaciones: Usa el Animator del Humanoid para reproducir las pistas de caminar y atacar.
- Detener las pistas: Para las animaciones cuando el NPC muera o pierda de vista a su objetivo.
¿Cuándo y cómo debe atacar el NPC enemigo?

Condiciones para iniciar el ataque
Un enemigo que ataca sin control resulta injusto y frustrante de enfrentar. Debe golpear solo cuando esté realmente cerca, con visión directa y respetando una pausa entre golpes. Ese enfriamiento es lo que hace que el combate se sienta justo.
- Distancia mínima: Define un rango corto de unos 5 studs para que solo ataque cuerpo a cuerpo.
- Línea de visión: Confirma con un Raycast que no hay ningún muro entre el NPC y el jugador.
- Tiempo de enfriamiento: Deja entre 1 y 2 segundos entre golpes usando una variable de control.
Aplicar daño al jugador
El daño siempre debe aplicarse desde el servidor, nunca desde un LocalScript, o cualquiera podría manipularlo. El método TakeDamage es el indicado porque respeta el escudo de fuerza si el jugador acaba de reaparecer. Comprobar que sigue vivo evita errores en cada golpe.
- Obtener el Humanoid: Localiza el Humanoid dentro del personaje del jugador antes de hacer nada.
- Usar TakeDamage: Aplica el daño con este método en lugar de restar Health directamente.
- Verificar el estado: Comprueba que el jugador siga con vida antes de encadenar el siguiente ataque.
Efectos visuales y sonoros del ataque
Los efectos no son decoración: avisan al jugador de que está recibiendo daño. Un sonido de golpe y un destello rojo comunican el peligro mucho mejor que ver bajar un número. Sincronizarlos con la animación hace que el impacto se sienta real.
- Reproducir la animación: Lanza la pista de ataque justo antes de aplicar el daño al jugador.
- Emitir sonido: Coloca un objeto Sound dentro del NPC y reprodúcelo en el momento del golpe.
- Retroalimentación visual: Añade un ParticleEmitter o un destello breve en pantalla al recibir el impacto.
¿Cómo evitar errores y mejorar el rendimiento del NPC?

Buenas prácticas en el script de IA
Un script mal estructurado provoca lag y comportamientos erráticos incluso con pocos enemigos. Lo fundamental es ejecutarlo siempre en el servidor y guardar las referencias fuera de los bucles. Añadir comprobaciones antes de cada llamada evita la mayoría de errores en la consola.
- Variables locales: Guarda el Humanoid y el HumanoidRootPart en variables al inicio del script.
- Ejecutar en el servidor: Coloca un Script normal dentro del NPC, nunca un LocalScript.
- Comprobar antes de actuar: Verifica que el Humanoid exista y tenga vida antes de llamar a MoveTo.
Reducir el impacto en el rendimiento
Diez enemigos calculando rutas a la vez pueden hundir los fotogramas de un servidor. La solución más eficaz es mantener dormidos a los que están lejos y despertarlos solo cuando un jugador se acerca. Con CollectionService gestionas grupos enteros desde un único script.
- Limitar los activos: Mantén un máximo razonable de NPC persiguiendo al mismo tiempo.
- Desactivar en la distancia: Pausa la IA de los enemigos que no tengan ningún jugador cerca.
- Usar etiquetas: Emplea CollectionService para activar o desactivar grupos completos de NPC de golpe.
Pruebas y depuración
Un NPC que funciona perfecto en solitario puede volverse loco con varios jugadores delante. Probarlo en ambos escenarios revela fallos que de otra forma descubrirían tus usuarios. Los mensajes en la consola te dicen exactamente en qué estado está el enemigo en cada momento.
- Prueba en solitario: Comprueba la detección, la persecución y el ataque con un único jugador.
- Prueba en multijugador: Verifica que el NPC no cambie de objetivo constantemente entre varios jugadores.
- Revisar la consola: Usa print para rastrear el estado del enemigo y localizar dónde falla la lógica.
Quieres saber sobre este juego
¿Cómo hacer que un NPC enemigo detecte y persiga al jugador en Roblox Studio?
Para que un NPC detecte y persiga al jugador, necesitas un Script de servidor dentro del NPC que calcule continuamente la distancia hasta el personaje más cercano y lo mueva hacia él con Humanoid:MoveTo o mediante PathfindingService. El proceso empieza insertando un modelo con su Humanoid y su HumanoidRootPart correctamente configurados. Después, en el script, obtienes el servicio Players y recorres la lista comparando la magnitud entre posiciones para quedarte con el jugador más próximo. Si esa distancia es menor que tu rango de detección, por ejemplo 50 studs, se activa la persecución. Para mapas con paredes conviene usar PathfindingService:CreatePath junto con ComputeAsync, y luego recorrer los waypoints resultantes llamando a MoveTo en cada uno. Si tu escenario es abierto y sin obstáculos, un MoveTo directo dentro de un bucle con task.wait resulta más sencillo y consume menos recursos. Recuerda comprobar siempre que el personaje exista y que su Humanoid siga vivo, y añade una condición de parada cuando el jugador se aleje demasiado.
| Componente | Función |
|---|---|
| Humanoid | Permite mover al NPC con MoveTo |
| PathfindingService | Calcula rutas esquivando obstáculos |
| Bucle de detección | Localiza al jugador más cercano |
| Rango de detección | Define desde qué distancia reacciona |
¿Cómo hacer que el NPC enemigo ataque al jugador cuando esté cerca?
Para que el NPC ataque, debes comprobar dentro del mismo bucle si la distancia hasta el jugador es menor que tu umbral de ataque, por ejemplo 5 studs, y entonces ejecutar la función de daño. Lo habitual es detener el movimiento en ese momento, reproducir la animación de golpe y aplicar el daño con Humanoid:TakeDamage sobre el personaje del jugador. Este método es preferible a restar la propiedad Health directamente, porque respeta el ForceField que protege a quien acaba de reaparecer. Es imprescindible añadir un tiempo de enfriamiento mediante una variable booleana o una marca de tiempo, ya que de lo contrario el NPC atacaría en cada vuelta del bucle y mataría al jugador al instante. Todo el cálculo del daño debe ocurrir en el servidor para evitar manipulaciones, aunque puedes usar un RemoteEvent si quieres disparar efectos visuales en el cliente. Y antes de cada golpe, verifica que el Humanoid del objetivo exista y conserve vida.
| Acción | Implementación |
|---|---|
| Detectar cercanía | Distancia menor a 5 studs |
| Aplicar daño | Humanoid:TakeDamage en el servidor |
| Evitar golpes seguidos | Variable de enfriamiento con task.wait |
| Validar el objetivo | Comprobar que sigue vivo antes de golpear |
¿Cómo evitar que el NPC enemigo se quede atascado o atraviese paredes al perseguir?
Para evitar atascos, utiliza PathfindingService en lugar de un MoveTo directo, ya que genera rutas que respetan la geometría del mapa incluyendo paredes, rampas y huecos. Llama a ComputeAsync pasando la posición del NPC y la del objetivo, comprueba que el estado devuelto sea correcto y recorre después los puntos obtenidos con GetWaypoints. Un detalle que mucha gente pasa por alto es configurar los parámetros del agente al crear la ruta: indicando el radio y la altura del NPC, el servicio evitará mandarlo por huecos por los que físicamente no cabe. Si el cálculo falla, lo sensato es esperar un momento y volver a intentarlo en lugar de forzar un movimiento directo. También conviene detectar los atascos comparando la posición del NPC cada pocos segundos: si apenas se ha movido pese a tener un destino, recalcula la ruta. Y muy importante, nunca desplaces al NPC modificando su CFrame a mano, porque eso sí lo hará atravesar paredes.
| Problema | Solución |
|---|---|
| El NPC se atasca | Recalcular la ruta con PathfindingService |
| Atraviesa paredes | Usar waypoints y nunca mover el CFrame |
| Ruta imposible | Comprobar el estado antes de moverse |
| Pasa por huecos estrechos | Definir el radio y la altura del agente |
¿Cómo añadir animaciones y efectos al ataque del NPC enemigo?
Para añadir animaciones al ataque, carga la pista en el Animator del Humanoid con LoadAnimation y reprodúcela con Play justo antes de aplicar el daño. Lo primero es comprobar que el NPC tenga un Animator dentro de su Humanoid, algo que los modelos de personaje ya incluyen por defecto. Después crea un objeto Animation con el ID de tu animación y cárgalo una sola vez al inicio del script, guardando la pista resultante en una variable: cargarla en cada golpe desperdicia recursos innecesariamente. Cuando el jugador entre en rango, llama a Play y espera un instante que coincida con el momento del impacto visual, normalmente medio segundo, antes de aplicar el daño real. Para los efectos, inserta un objeto Sound dentro del NPC y reprodúcelo en ese mismo instante, y añade si quieres un ParticleEmitter que emita una ráfaga breve con el método Emit. Todo esto debe ejecutarse desde el servidor para que lo vean todos los jugadores de la partida.
| Elemento | Cómo aplicarlo |
|---|---|
| Animación de ataque | Cargar con LoadAnimation y lanzar con Play |
| Sonido del golpe | Objeto Sound dentro del NPC |
| Partículas de impacto | ParticleEmitter con el método Emit |
| Sincronización | Aplicar el daño al llegar el impacto visual |
Si quieres conocer otros artículos parecidos a Cómo hacer un NPC enemigo que persiga y ataque en Roblox Studio puedes visitar la categoría Roblox Studio.
Deja una respuesta

Contenido que te podría interesar