A un livello base, il raycasting è l'atto di inviare un raggio invisibile da un punto Vector3 in una direzione specifica con una lunghezza definita. Una volta emesso, puoi rilevare se il raggio colpisce un BasePart o una cella di Terrain.
Puoi emettere un raggio usando il metodo WorldRoot:Raycast() (Workspace:Raycast()) da un'origine Vector3 in una direzione 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)Quando applicabile, puoi calcolare un vettore direzionale sconosciuto (rayDirection) usando un origine e un destinazione note. Questo è utile quando emetti un raggio tra due punti che possono cambiare, come da un personaggio giocatore a un altro.
L'origine più un vettore direzionale indicano la destinazione del raggio:
Sottrai da entrambi i lati dell'equazione:
La direzione del raggio è pari alla destinazione meno 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)Opzioni di filtro
WorldRoot:Raycast() accetta un oggetto RaycastParams opzionale che dice al raycast di includere o escludere selettivamente certi BaseParts, ignorare il materiale Acqua per Terrain, o utilizzare un gruppo di collisione.
| Chiave | Descrizione |
|---|---|
| FilterDescendantsInstances | Array di oggetti i cui discendenti vengono utilizzati per filtrare i candidati al raycasting. |
| FilterType | Enum Enum.RaycastFilterType che determina come viene utilizzato l'array FilterDescendantsInstances nell'operazione di raycast. |
| IgnoreWater | Booleano che determina se il materiale Acqua è considerato durante il raycasting contro Terrain. |
| CollisionGroup | Nome stringa del gruppo di collisione utilizzato per l'operazione di 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)Rilevamento collisioni
Se l'operazione di raycasting colpisce un BasePart o una cella di Terrain idonea, viene restituito un oggetto RaycastResult contenente i risultati. Per verificare un colpo, conferma che il risultato non sia nil e utilizza le seguenti proprietà se necessario.
| Proprietà | Descrizione |
|---|---|
| Instance | Il BasePart o la cella di Terrain che il raggio ha intersecato. |
| Position | Posizione Vector3 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 di Terrain al punto di intersezione. |
| Normal | Vector3 del vettore normale della faccia intersecata. |
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("Istanza:", raycastResult.Instance)
print("Posizione:", raycastResult.Position)
print("Distanza:", raycastResult.Distance)
print("Materiale:", raycastResult.Material)
print("Normale:", raycastResult.Normal)
else
warn("Nessun risultato del raycast!")
end