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 un collider de disparador o una consulta de rango para los impactos.

Proyectil basado en disparador

Crea un prefab con:

  • Un sprite o Spine_Animator

  • Un Circle_Collider con los campos Es disparador habilitado

  • El componente siguiente

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

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

Projectile :: class : Component {
    direction: v2;
    owner: Entity;
    @ao_serialize speed: float = 12;
    @ao_serialize damage: float = 25;
    @ao_serialize lifetime: float = 3;
    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 normal compartida de juego. La predicción ejecuta el mismo código en los clientes y en el servidor, así que no lo protejas con Game.is_server().

Proyectiles rápidos

Las comprobaciones de superposición del disparador pueden pasar por alto un objetivo pequeño cuando un proyectil lo cruza entre cuadros 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 mayor. Consulta Navmesh y colisión para un ejemplo de subpasos.

Llama a SFX.play desde la misma ruta de impacto predicha. El sistema de sonido reconcilia el sonido predicho con el resultado del servidor.

Última actualización