> 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-centrales-del-motor/movement-agents-npcs.md).

# Agentes de movimiento/NPCs

Usa Movement\_Agent para mover entidades con búsqueda de rutas y restricciones de navmesh.

### Agentes de movimiento

`Movement_Agent` es un componente auxiliar de movimiento usado para el control direccional y la 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 (bloquearla a un `Malla de navegación`)
* 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 ver detalles sobre la construcción/consulta de navmeshes y los triggers de colisionadores, consulta [Navmesh y colisión](/all-out-docs/docs-es/conceptos-centrales-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;
    }

    // Solicitar 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 (encájalo en ella en cada frame).
    // Pasa null para borrar.
    set_navmesh_to_lock_to :: method(navmesh: Navmesh);

    // Ajuste/estado comunes
    movement_speed:   float;
    agent_radius:     float;
    friction:         float;
    velocity:         v2;
    input_this_frame: v2; // solo escritura desde scripts; se pone a cero por la actualización de movimiento antes de que se ejecuten los callbacks (lee player.input_this_frame en su lugar)
}
```

### Física y triggers de movimiento de CSL

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

Colisión: los colisionadores no trigger habilitados del agente bloquean contra los colisionadores no trigger del mundo habilitados, 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.

Dos colisionadores interactúan solo cuando la `mask_bits` contiene la del otro `category_bits` (ambas son bitmasks u32). Los colisionadores tienen por defecto `category_bits: 1`, `mask_bits: 4294967295`. El colisionador del jugador es `category_bits: 2` con los campos `mask_bits` = todo excepto el bit 2 (los jugadores no colisionan entre sí). Deja los valores predeterminados como están a menos que necesites capas: una pared con `mask_bits: 1` o `category_bits: 2` no bloquea al jugador.

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, por lo 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 borrarlo.

### Creación de NPCs en movimiento

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

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

    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;
        }
    }
}
```
