New: Nitro Boost our Discord server and receive full donation perks here on the website! Join the Scripting Helpers Discord Server to learn more! You can also Support on Patreon as always.
Still have questions? Join our Discord server and get real time help.
3

How can I detect a surface a part hit?

Dominical 210
4 years ago

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!

0
GUI's are able to do this, I dont see why a part cant.. MessorAdmin 593 — 4y
0
I would like to know as well. Perci1 4911 — 4y

4

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.