Raycasting

*Este contenido se traduce usando la IA (Beta) y puede contener errores. Para ver esta página en inglés, haz clic en aquí.

En su nivel más básico, raycasting es el acto de enviar un rayo invisible desde un punto de Datatype.Vector3 con una dirección específica con una longitud definida. Una vez cast, puede detectar si el rayo golpea un Vector3 o BasePart celda.

Los láseres se disparan por orbes flotantes, y el raycasting determina si un láser golpea una plataforma. Las plataformas tocadas por los láseres se destruyen temporalmente.

Proyectar un Rayo

Puedes lanzar un rayo con el método WorldRoot:Raycast() ( workspace:Raycast() ) desde una fuente de Datatype.Vector3 en una dirección de Vector3 .

Raycast básico

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

Filtrado

Class.WorldRoot:Raycast() acepta un objeto de RaycastParams opcional que le dice al raycast que seleccione o excluya ciertos BaseParts , ignore el material de 0>Water0> para WorldRoot:Raycast()3> o use un grupo de colisión .

ClaveDescripción
FilterDescendantsInstancesArray de objetos cuyos descendientes se usan para filtrar candidatos de raycasting.
FilterTypeEnum.RaycastFilterTypeenum que determina cómoFilterDescendantsInstancesarray se usa en la operación de raycast.
  • Exclude — Cada BasePart es considerado excepto aquellos que son descendientes de objetos en el matriz/lista.
  • Include — Solo se consideran los BaseParts que son descendientes de objetos en el arreglo.
IgnoreWaterBooleano que determina si el material Agua se considera al raycasting en contra de Terrain .
CollisionGroupNombre de la cadena del grupo de colisión usado para la operación de raycasting.
Raycast Filtro

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)

Cálculo de dirección

Cuando sea aplicable, puede calcular un vector direccional desconocido ( rayDirection ) utilizando un conocido origen y destino . Esto es útil cuando se proyecta un rayo entre dos puntos que se pueden cambiar, como desde un personaje de un jugador a otro.

  1. La dirección más un vector direccional indican la dirección del rayo:

    rayOrigin + dirección de rayo = dirección de rayo

  2. Sustrae rayOrigin de ambos lados de la ecuación:

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

  3. La dirección de la rayas es la misma que la minus de la raya de origen:

    rayDirection = rayDestinationrayOrigin


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

Detectando golpes

Si la operación de raycasting golpea un BasePart o Terrain celda, un objeto de 2> Datatype.RaycastResult2> se devuelve que contiene los resultados. Para probar un golpe, asegúrese de que el resultado no es 5> nil5> y utilice las siguientes propiedades como necesario.

PropiedadDescripción
InstanceLa BasePart o Terrain celda que el rayo intersección.
PositionVector3 posición de la intersección entre el rayo y el Instance .
DistanceDistancia entre el punto de origen del rayo y el punto de intersección.
MaterialEl Enum.Material de la BasePart o Terrain en el punto de intersección.
NormalVector3 del vértice normal de la cara intersección.
Detecta golpes con 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