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.
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.
L'origine più un vector direzionale indica la destinazione del raggio:
rayOrigin + rayDirection = rayDestination
Sottrai rayOrigin da entrambi i lati dell'equazione:
rayOrigin + rayDirection − rayOrigin = rayDestination − rayOrigin
La direzione del raggio uguale la destinazione meno l'origine:
direzione del raggio = destinazione del raggio − origine del raggio
local Workspace = game:GetService("Workspace")local rayOrigin = Workspace.TestOrigin.Positionlocal rayDestination = Workspace.TestDestination.Positionlocal rayDirection = rayDestination - rayOriginlocal 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 .
Chiave | Descrizione |
---|---|
FilterDescendantsInstances | Array di oggetti i cui discendenti vengono utilizzati per filtrare i candidati di raycasting. |
FilterType | Enum.RaycastFilterType enum che determina come l'array FilterDescendantsInstances viene utilizzato nell'operazione di raycast. |
IgnoreWater | Boolean che determina se il materiale Acqua è considerato quando viene lanciato contro Terrain . |
CollisionGroup | Nome della stringa del gruppo di collisione utilizzato per l'operazione di raycasting. |
Filtro di 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)
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 |
---|---|
Instance | La BasePart o Terrain cellula che il raggio ha intersecato. |
Position | Vector3 posizione dell'intersezione tra il raggio e il Instance . |
Distance | Distanza tra l'origine del raggio e il punto di intersezione. |
Material | Il Enum.Material del BasePart o Terrain al punto di intersezione. |
Normal | Vector3 del normale vector della faccia intersezionata. |
Rilevamento degli attacchi Raycast
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