Assume that the player just mined (destroyed) a block. I would want to spawn a block right under the block they just mined but only if there is no block beneath it.What would be the best method to check if their is a part at a certain position such as the part the player just mined subtracted by a vector?
How would I check if there is a part at a certain position?
1 answer
You can use raycasting and check if a part collides with it by using workspace:FindPartOnRay(ray), which returns the first part that collides with that ray.
To create a ray, use Ray.new(origin vector3, direction vector3).
If you want to filter parts on the raycast, you can use workspace:FindPartOnRayWithWhitelist(ray,array) or workspace:FindPartOnRayWithIgnoreList(ray,array).
This is an example of raycasting, put it on a LocalScript. The code raychecks every second if there is a part beneath the player and if it does, it changes its color to red for one second:
local player = game.Players.LocalPlayer
local char = player.Character or player.CharacterAdded:Wait()
player.CharacterAdded:Connect(function() char = player.Character end)
while true do
if char:findFirstChild("HumanoidRootPart") then
local origin = char.HumanoidRootPart.Position
local direction = char.HumanoidRootPart.CFrame.UpVector*-1
local ray = Ray.new(origin,direction*10)
local ignoreList = {char} --ray wont collide with your own character anymore
local part = workspace:FindPartOnRayWithIgnoreList(ray,ignoreList)
if part then
local savedcolor = part.Color
part.BrickColor = BrickColor.Red()
wait(1)
part.Color = savedcolor
end
end
wait(1)
end
You can also use region3 to check with workspace:FindPartsInRegion3(). This returns all parts on a region3, and you can also filter it with a whitelist or ignorelist variant of the function.
This discussion is preserved as it was. New answers, comments, and votes are closed.
