Rzucanie promieni

*Ta zawartość została przetłumaczona przy użyciu narzędzi AI (w wersji beta) i może zawierać błędy. Aby wyświetlić tę stronę w języku angielskim, kliknij tutaj.

Na najbardziej podstawowym poziomie, rozpraszanie promieni jest aktem wysyłania niewidzialnego promienia z punktu Vector3 w określonym kierunku o określonej długości.Po wystrzeleniu możesz wykryć, czy promień uderza w komórkę BasePart lub Terrain.

Lasery są strzelane przez pływające kule, a rzucanie promieni określa, czy laser trafi na platforma.Platformy dotknięte przez lasery są tymczasowo niszczone.

Możesz wystrzelić promień za pomocą metody WorldRoot:Raycast() ( Workspace:Raycast() ) z źródła Vector3 w kierunku Vector3.

Podstawowy rzut promieni

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 mające zastosowanie, możesz obliczyć nieznany wektor kierunkowy ( rayDirection ) za pomocą znanego pochodzenia i docelu .Jest to przydatne, gdy rzuca się promień między dwoma punktami, które mogą się zmienić, takimi jak od jednej postaci gracza do drugiej.

  1. Pochodzenie plus wektor kierunkowy wskazują cel promienia:

    źródło promieni + kierunek promieni = cel promieni

  2. Odejmij rayOrigin z obu stron równania:

    rayOrigin + rayDirectionrayOrigin = rayDestinationrayOrigin

  3. Kierunek promienia równa się celowi pomniejszonemu o pochodzenie:

    kierunek promienia = cel promieniapochodzenie promienia


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 filtrowania

akceptuje opcjonalny obiekt , który mówi, aby promieniowanie wybierało lub pomijało określone , ignorowało materiał wodny dla lub używało grupy kolizyjnej .

KluczOpis
FilterDescendantsInstancesArray z obiektów, których potomkowie są używane do filtrowania kandydatów do raycastingu
FilterTypeEnum.RaycastFilterType enum, które określa, w jaki sposób matryca FilterDescendantsInstances jest używana w operacji raycast.
  • Exclude — Każdy BasePart jest uważany za z wyjątkiem tych, które są potomkami obiektów w matrycy.
  • Include — Tylko BaseParts te, które są potomkami obiektów w matrycy, są rozważane.
IgnoreWaterBoolean, który określa, czy materiał Woda jest rozważany przy rzucaniu promieni przeciwko Terrain .
CollisionGroupNazwa ciągu zderzeniowego grupy kolizyjnej używana do operacji rzucania promieni.
Filtracja Raycast

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 trafień

Jeśli operacja rzucania promieni trafi na kwalifikującą się komórkę BasePart lub Terrain, zostanie zwrócony obiekt RaycastResult, zawierający wyniki.Aby przetestować trafienie, potwierdź, że wynik nie jest nil i wykorzystaj następujące właściwości w razie potrzeby.

WłaściwośćOpis
InstanceKomórka BasePart lub Terrain, w której promień się skrzyżował.
PositionVector3 pozycja intersekcji między promieniem a Instance.
DistanceOdległość między punktem pochodzenia promienia a punktem styku.
MaterialThe Enum.Material of the BasePart lub Terrain na punkcie styku.
NormalVector3 z normalnego wektora intersekcyjnej twarzy.
Wykrywanie trafień Raycast

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("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