> 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/projectiles.md).

# Proyectiles

CSL no tiene un componente de proyectil integrado. Usa un prefab con un script para el movimiento y, ya sea un collider de activación o una consulta de alcance para los impactos.

## Proyectil basado en activador

Crea un prefab con:

* Un sprite o `Spine_Animator`
* Un `Circle_Collider` con **Es activador** habilitado
* El componente a continuación

```go
Damageable :: class : Component {
    health: float = 100 @ao_serialize;

    take_damage :: method(amount: float) {
        health -= amount;
    }
}

Projectile :: class : Component {
    direction: v2;
    owner: Entity;
    speed: float = 12 @ao_serialize;
    damage: float = 25 @ao_serialize;
    lifetime: float = 3 @ao_serialize;
    spent: bool;

    ao_start :: method() {
        collider := entity.get_component(Circle_Collider);
        collider.is_trigger = true;
        collider.on_trigger_start = proc(self: Collider, other: Collider) {
            projectile := self.entity.get_component(Projectile);
            projectile.hit(other.entity);
        };

        entity.queue_for_destruction(lifetime);
    }

    ao_update :: method(dt: float) {
        entity.add_local_position(direction * speed * dt);
    }

    hit :: method(other: Entity) {
        if spent return;
        if other == owner return;

        target := other.get_component(Damageable);
        if target == null return;

        spent = true;
        target.take_damage(damage);
        entity.destroy();
    }
}
```

Genera el prefab con `Scene.instantiate`, luego inicializa su componente:

```go
spawn_projectile :: proc(
    prefab: Prefab_Asset,
    owner: Entity,
    position: v2,
    direction: v2
) {
    assert(length_squared(direction) > 0, "la dirección del proyectil debe ser distinta de cero");

    projectile_entity := Scene.instantiate(prefab, position);
    projectile := projectile_entity.get_component(Projectile);
    projectile.owner = owner;
    projectile.direction = normalize(direction);
}
```

Ejecuta el movimiento y el daño del proyectil en la ruta compartida normal del juego. La predicción ejecuta el mismo código en clientes y servidor, así que no lo protejas con `Game.is_server()`.

## Proyectiles rápidos

Las comprobaciones de superposición de activadores pueden omitir un objetivo pequeño cuando un proyectil lo cruza entre fotogramas de simulación. Para proyectiles rápidos, consulta varios puntos a lo largo del segmento de movimiento con `Scene.get_all_components_in_range`, o usa un radio de colisión más grande. Consulta [Navmesh y colisión](/all-out-docs/docs-es/conceptos-basicos-del-motor/navmesh-and-collision.md#fast-movement-hits-simple-sub-stepping) para ver un ejemplo de subpasos.

Llama a `SFX.play` del mismo recorrido de impacto predicho. El sistema de sonido reconcilia el sonido predicho con el resultado del servidor.
