> For the complete documentation index, see [llms.txt](https://docs.allout.game/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.allout.game/all-out-docs/docs-es/conceptos-basicos-del-motor/movement-agents-npcs.md).

# Agentes de movimiento/NPCs

### Agentes de movimiento

`Movement_Agent` es un componente auxiliar de movimiento usado para guiado y búsqueda de rutas.

Lo más común es usarlo para:

* Solicitar una ruta hacia un objetivo (`set_path_target`)
* Restringir una entidad al espacio transitable (fijarla a un `Navmesh`)
* Moverse a través de geometría simple de colisionadores

{% hint style="info" %}
Esta página cubre el movimiento y la búsqueda de rutas. Para la construcción/consulta de navmeshes y detalles de triggers de colisionadores, consulta [Navmesh y colisión](/all-out-docs/docs-es/conceptos-basicos-del-motor/navmesh-and-collision.md).
{% endhint %}

### Referencia de la API de Movement\_Agent

```go
Movement_Agent :: class : Component {
    Set_Path_Target_Result :: struct {
        success:        bool;
        next_point:     v2;
        move_direction: v2;
    }

    // Solicita una ruta hacia el objetivo a una velocidad dada.
    set_path_target :: method(target: v2, speed: float) -> Set_Path_Target_Result;

    // Restringe este agente a una navmesh (ajústalo a ella en cada frame).
    // Pasa null para borrar.
    set_navmesh_to_lock_to :: method(navmesh: Navmesh);

    // Ajustes/estado comunes
    movement_speed:   float;
    agent_radius:     float;
    friction:         float;
    velocity:         v2;
    input_this_frame: v2;
}
```

### Física y triggers de movimiento CSL

Las entidades Movement\_Agent tienen una ruta de física CSL para un movimiento balístico simple.

Colisión: los colisionadores habilitados no trigger del agente bloquean contra los colisionadores del mundo habilitados no trigger, teniendo en cuenta `category_bits` / `mask_bits` el filtrado. El movimiento se detiene en el primer impacto y se desliza a lo largo de la superficie impactada.

Los callbacks de trigger pertenecen al colisionador y no requieren un `Movement_Agent`.

### Búsqueda de rutas (establecer un objetivo)

Llama a `set_path_target` en cada frame mientras la entidad deba seguir moviéndose. Una sola llamada no es un comando de movimiento persistente.

```go
follow_target :: proc(agent: Movement_Agent, target_pos: v2) {
    result := agent.set_path_target(target_pos, agent.movement_speed);

    if result.success {
        // result.next_point: siguiente punto de ruta
        // result.move_direction: dirección de movimiento normalizada (útil para orientación/animación)
    }
}
```

{% hint style="info" %}
`set_path_target` se procesa de forma asíncrona con otros agentes. El resultado devuelto es el dato de búsqueda de ruta completado más reciente, así que el primer frame en que estableces un nuevo objetivo puede no devolver `success == true`.
{% endhint %}

### Bloquear el movimiento a una navmesh (permanecer en el espacio transitable)

Si una entidad nunca debe salir del espacio transitable, bloquéala a una navmesh:

```go
agent.set_navmesh_to_lock_to(navmesh);
```

Llámalo con `null` para borrar.

### Creando NPCs en movimiento

Este es un NPC mínimo de “seguir al jugador” usando un agente de movimiento:

```go
Follower_NPC :: class : Component {
    agent: Movement_Agent @ao_serialize;
    target: Entity @ao_serialize;

    ao_update :: method(dt: float) {
        if !#alive(target) return;

        result := agent.set_path_target(target.world_position, agent.movement_speed);
        if result.success {
            // Opcional: orientar la dirección / establecer banderas de animación
            // dir := result.move_direction;
        }
    }
}
```
