En su nivel más básico, raycasting es el acto de enviar un rayo invisible desde un punto de Vector3 en una dirección específica con una longitud definida. Una vez emitido, puedes detectar si el rayo impacta un BasePart o una celda de Terrain.
Puedes emitir un rayo con el método WorldRoot:Raycast() (Workspace:Raycast()) desde un origen de Vector3 en una dirección de Vector3.
Raycast Básicolocal 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 (rayDirection) utilizando un origen y un destino conocidos. Esto es útil cuando emites un rayo entre dos puntos que pueden cambiar, como de un personaje jugador a otro.
El origen más un vector direccional indican el destino del rayo:
Resta de ambos lados de la ecuación:
La dirección del rayo es igual al destino menos el origen:
local Workspace = game:GetService("Workspace")local rayOrigin = Workspace.TestOrigin.Positionlocal rayDestination = Workspace.TestDestination.Positionlocal rayDirection = rayDestination - rayOriginlocal raycastResult = Workspace:Raycast(rayOrigin, rayDirection)
Opciones de filtro
WorldRoot:Raycast() acepta un objeto opcional RaycastParams que indica al raycast que incluya o excluya selectivamente ciertos BaseParts, ignore el material Agua para Terrain o use un grupo de colisión.
| Clave | Descripción |
|---|---|
| FilterDescendantsInstances | Array de objetos cuyos descendientes se utilizan en el filtrado de candidatos de raycasting. |
| FilterType | Enum RaycastFilterType que determina cómo se utiliza el array FilterDescendantsInstances en la operación de raycast. |
| IgnoreWater | Boolean que determina si el material Agua se considera al realizar raycasting contra Terrain. |
| CollisionGroup | Nombre en forma de cadena del grupo de colisión utilizado para la operación de raycasting. |
Filtrado de Raycastlocal Workspace = game:GetService("Workspace")local rayOrigin = Vector3.zerolocal rayDirection = Vector3.new(0, -100, 0)local raycastParams = RaycastParams.new()raycastParams.FilterDescendantsInstances = {script.Parent}raycastParams.FilterType = Enum.RaycastFilterType.ExcluderaycastParams.IgnoreWater = truelocal raycastResult = Workspace:Raycast(rayOrigin, rayDirection, raycastParams)
Detección de impactos
Si la operación de raycasting impacta un BasePart o una celda de Terrain elegible, se devuelve un objeto RaycastResult que contiene los resultados. Para probar por un impacto, confirma que el resultado no es nil y utiliza las siguientes propiedades según sea necesario.
| Propiedad | Descripción |
|---|---|
| Instance | El BasePart o la celda de Terrain que el rayo intersectó. |
| Position | Posición Vector3 de la intersección entre el rayo y el Instance. |
| Distance | Distancia entre el origen del rayo y el punto de intersección. |
| Material | El Enum.Material del BasePart o Terrain en el punto de intersección. |
| Normal | Vector3 del vector normal de la cara intersectada. |
Detección de Impacto de Raycastlocal Workspace = game:GetService("Workspace")local rayOrigin = Vector3.zerolocal rayDirection = Vector3.new(0, -100, 0)local raycastResult = Workspace:Raycast(rayOrigin, rayDirection)if raycastResult thenprint("Instancia:", raycastResult.Instance)print("Posición:", raycastResult.Position)print("Distancia:", raycastResult.Distance)print("Material:", raycastResult.Material)print("Normal:", raycastResult.Normal)elsewarn("¡Sin resultado de raycast!")end