A son niveau le plus basique, le lancer de rayons est l'acte d'envoyer un rayon invisible à partir d'un point Vector3 spécifique dans une direction définie avec une longueur définie.Une fois lancé, vous pouvez détecter si le rayon frappe une cellule BasePart ou Terrain .
Vous pouvez lancer un rayon avec la méthode WorldRoot:Raycast() ( Workspace:Raycast() ) à partir d'une origine Vector3 en direction Vector3.
Lancer de rayon basique
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 ( ) en utilisant une origine connue et une destination .Cela est utile lors du lancement d'un rayon entre deux points qui peuvent changer, comme d'un personnage joueur à un autre.
L'origine plus un vecteur directionnel indique la destination du rayon :
origine de rayon + direction de rayon = destination de rayon
Soustraire rayOrigin des deux côtés de l'équation :
rayOrigin + rayDirection − rayOrigin = rayDestination − rayOrigin
La direction du rayon correspond à la destination moins l'origine :
direction de rayon = destination de rayon − origine de rayon
local Workspace = game:GetService("Workspace")local rayOrigin = Workspace.TestOrigin.Positionlocal rayDestination = Workspace.TestDestination.Positionlocal rayDirection = rayDestination - rayOriginlocal raycastResult = Workspace:Raycast(rayOrigin, rayDirection)
Options de filtrage
accepte un objet optionnel qui indique au lancer de rayons de sélectionner ou d'exclure de façon sélective certains , d'ignorer le matériau eau pour ou d'utiliser un groupe de collision .
Clé | Avertissement |
---|---|
FilterDescendantsInstances | Array d'objets dont les descendants sont utilisés dans le filtrage des candidats de lancer de rayons |
FilterType | Enum.RaycastFilterType enum qui détermine comment l'array FilterDescendantsInstances est utilisée dans l'opération de lancer de rayons. |
IgnoreWater | Boolean qui détermine si le matériau eau est pris en compte lors du lancer de rayons contre Terrain . |
CollisionGroup | Nom de chaîne du groupe de collision utilisé pour l'opération de lancer de rayons. |
Filtre de raycast
local Workspace = game:GetService("Workspace")local rayOrigin = Vector3.zerolocal rayDirection = Vector3.new(0, -100, 0)local raycastParams = RaycastParams.new()raycastParams.FilterDescendantsInstances = {script.Parent}raycastParams.FilterType = Enum.RaycastFilterType.ExcluderaycastParams.IgnoreWater = truelocal raycastResult = Workspace:Raycast(rayOrigin, rayDirection, raycastParams)
Détection des coups
Si l'opération de lancer de rayons frappe une cellule éligible BasePart ou Terrain, un objet RaycastResult est retourné contenant les résultats.Pour tester un hit, confirmez que le résultat n'est pas nil et utilisez les propriétés suivantes comme nécessaire.
Propriété | Avertissement |
---|---|
Instance | La cellule BasePart ou Terrain dans laquelle le rayon a intersecté. |
Position | Vector3 position 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 Terrain au point d'intersection. |
Normal | Vector3 du vecteur normal de la face intersectionnée. |
Détection des coups de lancer de rayons
local Workspace = game:GetService("Workspace")local rayOrigin = Vector3.zerolocal rayDirection = Vector3.new(0, -100, 0)local raycastResult = Workspace:Raycast(rayOrigin, rayDirection)if raycastResult thenprint("Instance:", raycastResult.Instance)print("Position:", raycastResult.Position)print("Distance:", raycastResult.Distance)print("Material:", raycastResult.Material)print("Normal:", raycastResult.Normal)elsewarn("No raycast result!")end