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.
Raycast di Baselocal 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.Positionlocal rayDestination = Workspace.TestDestination.Positionlocal rayDirection = rayDestination - rayOriginlocal 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. |
Filtraggio del Raycastlocal 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 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. |
Rilevamento del Colpo del Raycastlocal Workspace = game:GetService("Workspace")local rayOrigin = Vector3.zerolocal rayDirection = Vector3.new(0, -100, 0)local raycastResult = Workspace:Raycast(rayOrigin, rayDirection)if raycastResult thenprint("Istanza:", raycastResult.Instance)print("Posizione:", raycastResult.Position)print("Distanza:", raycastResult.Distance)print("Materiale:", raycastResult.Material)print("Normale:", raycastResult.Normal)elsewarn("Nessun risultato del raycast!")end