This module will quickly take care of any raycasting functionality needed. Raycast to positions, in directions, or towards input.
Example client:
local rayModule = require(game.ReplicatedStorage.rayModule)
game.UserInputService.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 then
local ray = rayModule.rayCastToInput(workspace.CurrentCamera.CFrame.Position,input)
end
end)
Module:
local RaycastModule = {}
-- Constants
local RAYCAST_DISTANCE = 1000
local Params = RaycastParams.new()
Params.FilterDescendantsInstances = {workspace.CurrentCamera}
local function rayCast(origin, direction,passed_Params)
local raycastParam = passed_Params or Params
local worldRay = Ray.new(origin, direction.Unit * RAYCAST_DISTANCE)
local raycastResult = workspace:Raycast(worldRay.Origin, worldRay.Direction * RAYCAST_DISTANCE, raycastParam)
-- Optional beam visualization
if raycastResult then
local size = Vector3.new(0.2, 0.2, (worldRay.Origin - raycastResult.Position).Magnitude-2)
local cframe = CFrame.lookAt(worldRay.Origin, raycastResult.Position) * CFrame.new(0, 0, -(size.Z/2)-2)
else
print("no hit")
end
return raycastResult
end
function RaycastModule.rayCastInDirection(origin, direction,passed_Params)
return rayCast(origin, direction,passed_Params)
end
function RaycastModule.rayCastToPoint(origin, goalPos,passed_Params)
local direction = goalPos - origin
return rayCast(origin, direction,passed_Params)
end
function RaycastModule.rayCastToInput(origin, inputObject,passed_Params)
local Camera = workspace.CurrentCamera
local worldRay = Camera:ScreenPointToRay(inputObject.Position.X, inputObject.Position.Y)
return rayCast(origin, worldRay.Direction,passed_Params)
end
return RaycastModule