Au niveau le plus basique, le raycasting est l'acte d'envoyer un rayon invisible depuis un point Vector3 dans une direction spécifique avec une longueur définie. Une fois tiré, vous pouvez détecter si le rayon touche un BasePart ou une cellule de Terrain.
Vous pouvez tirer un rayon avec la méthode WorldRoot:Raycast() (Workspace:Raycast()) à partir d'une origine Vector3 dans une direction Vector3.
local Workspace = game:GetService("Workspace")
local rayOrigin = Vector3.new(0, 0, 0)
local rayDirection = Vector3.new(0, -100, 0)
local raycastResult = Workspace:Raycast(rayOrigin, rayDirection)Lorsque cela est applicable, vous pouvez calculer un vecteur directionnel inconnu (rayDirection) en utilisant une origine et une destination connues. Ceci est utile lors du tir d'un rayon entre deux points pouvant changer, comme d'un personnage joueur à un autre.
L'origine plus un vecteur directionnel indique la destination du rayon :
Soustrayez des deux côtés de l'équation :
La direction du rayon égale la destination moins l'origine :
local Workspace = game:GetService("Workspace")
local rayOrigin = Workspace.TestOrigin.Position
local rayDestination = Workspace.TestDestination.Position
local rayDirection = rayDestination - rayOrigin
local raycastResult = Workspace:Raycast(rayOrigin, rayDirection)Options de filtrage
WorldRoot:Raycast() accepte un objet RaycastParams optionnel qui indique au raycast d'inclure ou d'exclure sélectivement certains BaseParts, d'ignorer le matériau Eau pour Terrain, ou d'utiliser un groupe de collision.
| Clé | Description |
|---|---|
| FilterDescendantsInstances | Array d'objets dont les descendants sont utilisés pour filtrer les candidats au raycasting. |
| FilterType | Énumération Enum.RaycastFilterType qui détermine comment le tableau FilterDescendantsInstances est utilisé dans l'opération de raycast. |
| IgnoreWater | Booléen qui détermine si le matériau Eau est considéré lors du raycasting contre Terrain. |
| CollisionGroup | Nom en chaîne du groupe de collision utilisé pour l'opération de raycasting. |
local Workspace = game:GetService("Workspace")
local rayOrigin = Vector3.zero
local rayDirection = Vector3.new(0, -100, 0)
local raycastParams = RaycastParams.new()
raycastParams.FilterDescendantsInstances = {script.Parent}
raycastParams.FilterType = Enum.RaycastFilterType.Exclude
raycastParams.IgnoreWater = true
local raycastResult = Workspace:Raycast(rayOrigin, rayDirection, raycastParams)Détection des impacts
Si l'opération de raycasting touche un BasePart ou une cellule de Terrain éligible, un objet RaycastResult est renvoyé contenant les résultats. Pour tester la présence d'un impact, assurez-vous que le résultat n'est pas nil et utilisez les propriétés suivantes si nécessaire.
| Propriété | Description |
|---|---|
| Instance | Le BasePart ou la cellule de Terrain que le rayon a intersecté. |
| Position | Position Vector3 de l'intersection entre le rayon et le Instance. |
| Distance | Distance entre l'origine du rayon et le point d'intersection. |
| Material | Le Enum.Material du BasePart ou de Terrain au point d'intersection. |
| Normal | Vector3 du vecteur normal de la face intersectée. |
local Workspace = game:GetService("Workspace")
local rayOrigin = Vector3.zero
local rayDirection = Vector3.new(0, -100, 0)
local raycastResult = Workspace:Raycast(rayOrigin, rayDirection)
if raycastResult then
print("Instance:", raycastResult.Instance)
print("Position:", raycastResult.Position)
print("Distance:", raycastResult.Distance)
print("Material:", raycastResult.Material)
print("Normal:", raycastResult.Normal)
else
warn("Aucun résultat de raycast !")
end