Raycasting

*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, raycasting to akt wysyłania niewidocznego promienia z Vector3 punktu w określonym kierunku z określoną długością. Po zeskanowaniu można wykryć, czy promień trafi na BasePart lub 2>Class.Terrain2> komórki.

Lasery są uruchamiane przez pływające kule, a Raycasting określa, czy laser trafi na platforma. dotykane przez lasery są tymczasowo niszczone.

Odblokowanie promienia

Możesz zrzucać promień z metodą WorldRoot:Raycast() ( workspace:Raycast() ) z źródła w kierunku Vector3 .

Podstawowy Raycast

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

Filtrowanie

WorldRoot:Raycast() akceptuje opcjonalny obiekt RaycastParams, który mówi raycastowi, aby wyłączył pewne BaseParts, ignorował materiał 0>Water0> dla Class.Terrain lub użył grupy kolizji .

KluczOpis
FilterDescendantsInstancesArray obiektów, których potomstwo jest używane do filtrowania kandydatów do kastingu promieni.
FilterTypeEnum.RaycastFilterTypeenum, które określa sposóbFilterDescendantsInstancesarray jest używany w operacji raycast.
  • Exclude — Każdy BasePart jest uważany za except tych, którzy są potomstwami obiektów w matrycy.
  • Include — Dotyczy tylko BaseParts, które są potomstwami obiektów w matrycy.
IgnoreWaterBoolean, który określa, czy materiał Woda jest uważany podczas rzucania promieniami przeciwko Terrain.
CollisionGroupImię grupy kolizji używanej do operacji raycastingu.
Filtrowanie 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)

Obliczanie kierunku

Gdy to mające zastosowanie, możesz obliczyć nieznany wektor kierunkowy ( rayDirection ) używając znanego pochodzenia i celu . To jest użyteczne, gdy rzucasz promień między dwoma punktami, które mogą się zmieniać, takimi jak od jednego postaci gracza do drugiego.

  1. Oryginał plus wektor kierunkowy wskazują położenie promienia:

    rayOrigin + rayDirection = rayDestination

  2. Odejmij rayOrigin z obu stron równania:

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

  3. Kierunek promienia jest równy celowi minus od źródła:

    kierunek promienia = kierunek docelowypromień pochodzenia


local rayOrigin = workspace.TestOrigin.Position
local rayDestination = workspace.TestDestination.Position
local rayDirection = rayDestination - rayOrigin
local raycastResult = workspace:Raycast(rayOrigin, rayDirection)

Wykrywanie trafień

Jeśli operacja raycasting dotyka komórki BasePart lub Terrain, zwraca się obiekt 2> Datatype.RaycastResult2> zawierający wyniki. Aby testować trafienie, potwierdź, że wynik nie jest 5> nil5> i użyj następujących właściwości, jeśli

WłasnośćOpis
InstanceClass.BasePart lub Terrain komórka, do której trafił promień.
PositionVector3 pozycja intersekcji między promieniem a Instance .
DistanceDystans między źródłem promienia i punktem interwencji.
MaterialClass.BasePart lub BasePart na punktze interwencyjnym.
NormalVector3 z normalnego wektora twarzy połączonych.
Wykrywanie kolizji z Raycast

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