Detecția Razelor (Raycasting) în Workspace: workspace:Raycast și RaycastParams în Luau (Roblox Studio)

Fizică & Detecție Spațială Roblox Engine 2026

Ghid complet pentru Raycasting în Roblox Studio: trasarea de raze liniare pentru arme, lasere și detecția liniei de vizibilitate folosind RaycastParams și filtre de instanțe.

Sintaxă
local rezultat = workspace:Raycast(origine, directie, params)

Raycasting-ul este tehnica prin care o linie dreaptă matematică (o rază) este proiectată dintr-un punct de pornire pe o anumită direcție și distanță pentru a detecta dacă și unde lovește o suprafață fizică. Este utilizat pentru arme de tip hitscan, sisteme de vedere ale inamicilor (Line of Sight) și lipirea la sol a picioarelor personajelor (Inverse Kinematics).

Implementarea unui foc de armă hitscan cu Raycasting
local function trageRazaArma(origineRaza: Vector3, directieTinta: Vector3, personajTragator: Model)
    -- 1. Configurarea parametrilor de filtrare a razei:
    local params = RaycastParams.new()
    params.FilterType = RaycastFilterType.Exclude -- Ignoră obiectele specificate
    params.FilterDescendantsInstances = { personajTragator } -- Ignorăm propriul corp pentru a nu ne împușca singuri
    params.IgnoreWater = true

    -- 2. Lansarea razei în lumea fizică (pe o distanță maximă de 300 de unități):
    local directieNormalizata = directieTinta.Unit * 300
    local rezultatRaycast = workspace:Raycast(origineRaza, directieNormalizata, params)

    -- 3. Analizarea rezultatului loviturii:
    if rezultatRaycast then
        local piesaLovita = rezultatRaycast.Instance
        local punctImpact = rezultatRaycast.Position
        local normalaSuprafata = rezultatRaycast.Normal

        print(`Raza a lovit piesa '{piesaLovita.Name}' la coordonatele: {punctImpact}`)

        -- Verificăm dacă piesa lovită aparține unui inamic:
        local inamicUmanoid = piesaLovita.Parent:FindFirstChildWhichIsA("Humanoid")
        if inamicUmanoid then
            inamicUmanoid:TakeDamage(30)
            print("Lovitură reușită! -30 viață.")
        end
    else
        print("Raza nu a întâlnit niciun obstacol în traiectoria sa.")
    end
end