Casting a raggi

*Questo contenuto è tradotto usando AI (Beta) e potrebbe contenere errori. Per visualizzare questa pagina in inglese, clicca qui.

Al suo Livellopiù basilare, raycasting è l'atto di inviare un raggio invisibile da un punto Vector3 in una direzione specifica con una lunghezza definita.Una volta lanciato, puoi rilevare se il raggio colpisca una BasePart o Terrain cellula.

I laser vengono sparati da sfere fluttuanti e il raycasting determina se un laser colpisce una Piattaforma.Le piattaforme toccate dai laser vengono temporaneamente distrutte.

Puoi lanciare un raggio con il metodo WorldRoot:Raycast() ( Workspace:Raycast() ) da un'origine Vector3 in una direzione Vector3.

Lancio del raggio di base

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)

Quando è Applicabile, puoi calcolare un veicolo direzionale sconosciuto ( ) utilizzando un'origine nota e una destinazione .Questo è utile quando si lancia un raggio tra due punti che possono cambiare, come da un personaggio giocatore all'altro.

  1. L'origine più un vector direzionale indica la destinazione del raggio:

    rayOrigin + rayDirection = rayDestination

  2. Sottrai rayOrigin da entrambi i lati dell'equazione:

    rayOrigin + rayDirectionrayOrigin = rayDestinationrayOrigin

  3. La direzione del raggio uguale la destinazione meno l'origine:

    direzione del raggio = destinazione del raggioorigine del raggio


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)

Opzioni di filtro

WorldRoot:Raycast() accetta un oggetto opzionale RaycastParams che dice al raycast di includere o escludere selettivamente alcuni BaseParts , ignora il materiale Acqua per Terrain , o usa un gruppo di collisione .

ChiaveDescrizione
FilterDescendantsInstancesArray di oggetti i cui discendenti vengono utilizzati per filtrare i candidati di raycasting.
FilterTypeEnum.RaycastFilterType enum che determina come l'array FilterDescendantsInstances viene utilizzato nell'operazione di raycast.
  • Exclude — Ogni BasePart è considerato tranne quelli che sono discendenti di oggetti nell'vettore.
  • Include — Sono considerati solo BaseParts quelli che sono discendenti di oggetti nell'array.
IgnoreWaterBoolean che determina se il materiale Acqua è considerato quando viene lanciato contro Terrain .
CollisionGroupNome della stringa del gruppo di collisione utilizzato per l'operazione di raycasting.
Filtro di Raycast

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)

Rilevamento degli errori

Se l'operazione di lancio del raggio colpisce una cellula idonea BasePart o Terrain , un oggetto RaycastResult viene restituito contenente i risultati.Per testare un colpo, conferma che il risultato non è nil e utilizza le seguenti proprietà come necessario.

ProprietàDescrizione
InstanceLa BasePart o Terrain cellula che il raggio ha intersecato.
PositionVector3 posizione dell'intersezione tra il raggio e il Instance .
DistanceDistanza tra l'origine del raggio e il punto di intersezione.
MaterialIl Enum.Material del BasePart o Terrain al punto di intersezione.
NormalVector3 del normale vector della faccia intersezionata.
Rilevamento degli attacchi Raycast

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