Scripting HelpersARCHIVE
A little piece of Roblox history. Preserved for everyone, one question at a time.Read about the archive →
COMMUNITY QUESTION

How can I detect a surface a part hit?

Hello! I've been wondering on how I could detect which surface a bullet(part) hit. I've searched the wiki without finding an efficient solution. I could use TargetSurface but that can't return the surface the actual bullet hit. I apologize for lacking a bit of info or code if I am.

local bullet=script.Parent
bullet.Touched:connect(function(hit)
if hit:IsA("Part") then
-- detect surface; how can I achieve this?
end
end)

If this is not possible in Roblox, I apologize as well. I appreciate any help!

2 comments

0

GUI's are able to do this, I dont see why a part cant..

0

I would like to know as well.

1 answer

You could do something like check which side of the part is in closest proximity to the bullet. For this, you'd have to write this thingy here:

--(Assuming the script is within the bullet)

local bullet = script.Parent

bullet.Touched:connect(function(hit)
if hit:IsA("Part") then

local sides = {}
local sizes = Vector3.new(hit.Size.X,hit.Size.Y,hit.Size.Z)
local pos = hit.Position
sides[1] = pos + hit.CFrame:vectorToWorldSpace(Vector3.new(0,0,-hit.Size.Z/2))--front
sides[2]= pos + hit.CFrame:vectorToWorldSpace(Vector3.new(0,0,hit.Size.Z/2))--back
sides[3] = pos + hit.CFrame:vectorToWorldSpace(Vector3.new(hit.Size.X/2,0,0))--right
sides[4] = pos + hit.CFrame:vectorToWorldSpace(Vector3.new(-hit.Size.X/2,0,0))--left
sides[5] = pos + hit.CFrame:vectorToWorldSpace(Vector3.new(0,hit.Size.Y/2,0))--top
sides[6] = pos + hit.CFrame:vectorToWorldSpace(Vector3.new(0,-hit.Size.Y/2,0))--bottom

local ClosestSide = 1
for i,v in ipairs(sides) do
if (bullet.Position - v).Magnitude < (bullet.Position - sides[ClosestSide]).Magnitude then
ClosestSide = i
end
end

if ClosestSide == 1 then print("front")
elseif ClosestSide == 2 then print("back")
elseif ClosestSide == 3 then print("right")
elseif ClosestSide == 4 then print("left")
elseif ClosestSide == 5 then print("top")
elseif ClosestSide == 6 then print("bottom")
end
end
end)

front = negative z back = positive z right = positive x left = negative x top = positive y bottom = negative y

Now unfortunately, this is only accurate when used on on cubes, or other objects with symmetrical sizes. Don't worry though, hopefully I'll be able to edit this answer later and provide a better solution.

I'll also adjust the script later so you can actually reference the side.

This discussion is preserved as it was. New answers, comments, and votes are closed.