Lanzamiento de rayos

*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 Vector3 específico en una dirección definida con una longitud definida.Una vez lanzado, puedes detectar si el rayo golpea una celda BasePart o Terrain .

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

Puedes lanzar un rayo con el método WorldRoot:Raycast() ( Workspace:Raycast() ) desde un origen Vector3 en una dirección Vector3.

Lanzamiento de rayo básico

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)

Cuando sea aplicable, puedes calcular un vector direccional desconocido ( ) usando un origen conocido y un destino conocido .Esto es útil al lanzar un rayo entre dos puntos que pueden cambiar, como de un personaje de jugador a otro.

  1. El origen más un vector direccional indican el destino del rayo:

    rayOrigin + rayDirection = rayDestination

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

    rayOrigin + rayDirectionrayOrigin = rayDestinationrayOrigin

  3. La dirección del rayo iguala al destino menos el origen:

    dirección de rayo = destino de rayoorigen de rayo


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)

Opciones de filtro

acepta un objeto opcional que le dice al raycast que incluya o excluya selectivamente ciertos , ignore el material de agua para o use un grupo de colisión .

ClaveDescripción
FilterDescendantsInstancesArray de objetos cuyos descendientes se utilizan en la filtración de candidatos de raycasting
FilterTypeEnum.RaycastFilterType enum que determina cómo se usa el FilterDescendantsInstances array en la operación de raycast.
  • Exclude — Cada BasePart se considera excepto aquellos que son descendientes de objetos en el matriz/lista.
  • Include — Solo se consideran BaseParts aquellos que son descendientes de objetos en el array.
IgnoreWaterBooleano que determina si el material Agua se considera al lanzar rayos contra Terrain.
CollisionGroupNombre de cadena del grupo de colisión usado para la operación de lanzamiento de rayos.
Filtrado de 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)

Detección de golpes

Si la operación de lanzamiento de rayos golpea una celda elegible BasePart o Terrain, se devuelve un objeto RaycastResult que contiene los resultados.Para probar un golpe, confirma que el resultado no es nil y utiliza las siguientes propiedades según sea necesario.

PropiedadDescripción
InstanceLa celda BasePart o Terrain que el rayo interseccionó.
PositionVector3 posición de la intersección entre el rayo y el Instance.
DistanceDistancia entre el 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 vector normal del rostro interseccionado.
Detección de golpes de 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