For the complete documentation index, see llms.txt. This page is also available as Markdown.

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

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:

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 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.

Última actualización