Raycasting

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

Al suo Livellopiù base, raycasting è l'atto di inviare un raggio invisibile da un punto Vector3 in una direzione specifica con una lunghezza definita. Una volta cast, puoi rilevare se il raggio colpisce una BasePart o 1> Class.Terrain1> cellulare.

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

Raggiare un Raggio

Puoi castare un raggio con il metodo WorldRoot:Raycast() ( workspace:Raycast() ) da un'origine Vector3 in una direzione 1> Datatype.Vector31> .

Raggio di base

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

Filtraggio

WorldRoot:Raycast() accetta un oggetto RaycastParams opzionale che dice al raycast di includere o escludere in modo selettivo alcuni BaseParts , ignorare il materiale 0>Water0> per Class.Terrain o usare un gruppo di collisione .

ChiaveDescrizione
FilterDescendantsInstancesArray di oggetti il cui discendente è usato per filtrare i candidati a raycasting.
FilterTypeEnum.RaycastFilterTypeenum che determina come ilFilterDescendantsInstancesarray è utilizzato nell'operazione raycast.
  • Exclude — Ogni BasePart è considerato **** ecetto quelli che sono discendenti di oggetti nell' vettore.
  • Include — Sono considerati solo BaseParts che sono discendenti di oggetti nell' array.
IgnoreWaterBoolean che determina se il materiale Acqua è considerato quando si raycast su Terrain .
CollisionGroupNome della stringa del gruppo di collisione usato per l'operazione di raycasting.
Filtro 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)

Calcolo della direzione

Quando Applicabile, puoi calcolare un vecchio vettore direzionale ( rayDirection ) utilizzando una conoscenza origine e destinazione conosciuta. Questo è utile quando si lancia un raggio tra due punti che possono cambiare, come da un personaggio di un giocatore all'altro.

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

    rayOrigin + rayDirection = rayDestination

  2. Sottrai rayOrigin dai lati dell'equazione:

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

  3. La direzione del raggio corrisponde alla destinazione 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)

Rilevare Colpi

Se l'operazione raycasting colpisce un BasePart o Terrain cellule idonee, un oggetto 2> Datatype.RaycastResult2> viene restituito contenente i risultati. Per testare per un hit, conferma che il risultato non è 5> nil5> e utilizza le seguenti proprietà come necessario.

ProprietàDescrizione
InstanceLa BasePart o Terrain cellula che il raggio ha interseccato.
PositionVector3 posizione dell'intersezione tra il raggio e il Instance .
DistanceDistanza tra l'origine del raggio e il punto di intersezione.
MaterialIl Enum.Material della BasePart o Terrain all'intersezione.
NormalVector3 del normale veicolo del viso interessato.
Raycast Rilevamento colpi

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