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