Na najprostszej płaszczyźnie, rykastowanie to akt wysyłania niewidocznej wiązki z punktu Vector3 w określonym kierunku z zdefiniowaną długością. Po rykastowaniu możesz wykryć, czy wiązka trafia w BasePart lub komórkę Terrain.
Możesz rykastować wiązkę za pomocą metody WorldRoot:Raycast() (Workspace:Raycast()) z pochodzenia Vector3 w kierunku 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)Gdy to możliwe, możesz obliczyć nieznany wektor kierunkowy (rayDirection) używając znanego pochodzenia i przeznaczenia. Jest to użyteczne, gdy rykastujesz wiązkę między dwoma punktami, które mogą się zmieniać, takimi jak od jednego gracza do drugiego.
Pochodzenie plus wektor kierunkowy wskazują przeznaczenie wiązki:
Odejmij od obu stron równania:
Kierunek wiązki to przeznaczenie minus pochodzenie:
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)Opcje filtru
WorldRoot:Raycast() akceptuje opcjonalny obiekt RaycastParams, który informuje rykastowanie, aby selektywnie uwzględniało lub wykluczało określone BaseParts, ignorowało materiał Woda dla Terrain, lub używało grupy kolizji collision group.
| Klucz | Opis |
|---|---|
| FilterDescendantsInstances | Array obiektów, których potomków używa się do filtrowania kandydatów do rykastowania. |
| FilterType | Enum Enum.RaycastFilterType, który określa, jak tablica FilterDescendantsInstances jest używana w operacji rykastowania. |
| IgnoreWater | Boolean, który określa, czy materiał Woda jest brany pod uwagę podczas rykastowania przeciwko Terrain. |
| CollisionGroup | Stringowa nazwa grupy kolizji collision group używanej w operacji rykastowania. |
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)Wykrywanie trafienia
Jeśli operacja rykastowania trafia w kwalifikującą się BasePart lub komórkę Terrain, zwracany jest obiekt RaycastResult zawierający wyniki. Aby sprawdzić trafienie, upewnij się, że wynik nie jest nil i wykorzystaj następujące właściwości w razie potrzeby.
| Właściwość | Opis |
|---|---|
| Instance | Obiekt BasePart lub komórka Terrain, z którą wiązka się przecięła. |
| Position | Pozycja Vector3 punktu przecięcia między wiązką a Instance. |
| Distance | Odległość między pochodzeniem wiązki a punktem przecięcia. |
| Material | Material Enum.Material obiektu BasePart lub Terrain w punkcie przecięcia. |
| Normal | Vector3 normalnego wektora przeciętej powierzchni. |
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("Instancja:", raycastResult.Instance)
print("Pozycja:", raycastResult.Position)
print("Odległość:", raycastResult.Distance)
print("Materiał:", raycastResult.Material)
print("Normalna:", raycastResult.Normal)
else
warn("Brak wyniku rykastowania!")
end