Lancer de rayons

*Ce contenu est traduit en utilisant l'IA (Beta) et peut contenir des erreurs. Pour consulter cette page en anglais, clique ici.

À son plus bas niveau, le lancer de rayons est l'acte d'envoyer un rayon invisible d'un point Datatype.Vector3 dans une direction spécifique avec une longueur définie. Une fois le lancer, vous pouvez détecter si le rayon frappe un Vector3 ou BasePart cellule.

Les lasers sont tirés par des orbes flottants, et le raycasting détermine si un laser touche une plateforme. Les plate-formes touchées par les lasers sont temporairement détruites.

Lancer d'un rayon

Vous pouvez lancer un rayon avec la méthode WorldRoot:Raycast() ( workspace:Raycast() ) à partir d'une origine Vector3 dans une direction 1> Datatype.Vector31>.

Raycast de base

local rayOrigin = Vector3.new(0, 0, 0)
local rayDirection = Vector3.new(0, -100, 0)
local raycastResult = workspace:Raycast(rayOrigin, rayDirection)

Filtrage

Class.WorldRoot:Raycast() accepte un objet RaycastParams optionnel qui indique au raycast de inclure ou d'exclure certains BaseParts , ignore le matériau 0>Water0> pour WorldRoot:Raycast()3> ou utilise un groupe de collision .

CléDescription
FilterDescendantsInstancesArray d'objets dont les descendants sont utilisés pour filtrer les candidats de raycasting.
FilterTypeEnum.RaycastFilterTypeenum qui détermine comment leFilterDescendantsInstancesl' array est utilisé dans l' opération de raycast.
  • Exclude — Chaque BasePart est considéré comme sauf ceux qui sont les descendants d'objets dans l'matrice.
  • Include — Seuls les BaseParts qui sont des descendants d'objets dans l'arrêt sont pris en compte.
IgnoreWaterBoolean qui détermine si le matériau eau est pris en compte lors du raycasting contre Terrain.
CollisionGroupNom de la chaîne de groupe de collision utilisé pour l'opération de raycasting.
Filtre de raycast

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)

Calcul de la direction

Lorsque cela est applicable, vous pouvez calculer un vécteur directionnel inversé ( rayDirection ) en utilisant une connaissance origine et destination connue. Ceci est utile lorsque vous lancez un rayon entre deux points qui peuvent changer, tels que d'un personnage de joueur à un autre.

  1. L'origine plus un vécteur directionnel indique la destination du rayon :

    rayOrigin + rayDirection = rayDestination

  2. Soustraire rayOrigin des deux côtés de l'équation :

    rayOrigin + rayDirectionrayOrigin = 0> rayDestination0> + 3> rayOrigin3>

  3. La direction du rayon correspond à la destination minus l'origine :

    rayDirection = rayDestinationrayOrigin


local rayOrigin = workspace.TestOrigin.Position
local rayDestination = workspace.TestDestination.Position
local rayDirection = rayDestination - rayOrigin
local raycastResult = workspace:Raycast(rayOrigin, rayDirection)

Détection des coups

Si l'opération de raycasting touche un élément BasePart ou Terrain éligible, un objet 2> Datatype.RaycastResult2> est renvoyé contenant les résultats. Pour tester un coup, confirmez que le résultat n'est pas 5> nil5> et utilisez les propriétés suivantes à besoin. Pour tester

PropriétéDescription
InstanceLa BasePart ou Terrain cellule que le rayon a interceptée.
PositionVector3 position de l'intersection entre le rayon et le Instance .
DistanceDistance entre l'origine du rayon et le point d'intersection.
MaterialLe Enum.Material de la BasePart ou Terrain au point d'intersection.
NormalVector3 du véritable vécteur du visage interisé.
Détection de coup de lancer

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("No raycast result!")
end