Module: Raycast(to position, to direction, to input)

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
1 Like